получение уникальных записей на основе конкретного связанного столбца - рельсы активных записей ассоциаций - PullRequest
0 голосов
/ 13 марта 2019

У меня три модели. User, Question и Attempt.

Каждый User has_many :attempts,

аналогично, Question has_many :attempts

и Attempt belongs_to User и Question

Обязательно:

То, что я хочу, это метод возврата последней попытки пользователя для каждого вопроса, с которым у пользователя была связана попытка.

Я имею в виду, если пользователь предпринял попытку q1, q2 и имеет 3 попытки для каждого вопроса, тогда мой метод должен вернуть последнюю попытку q1 и последнюю попытку q2.

Прямо сейчас: Я создал метод в User модель.

  def last_attempts
    return self.attempts.joins(:question).order("questions.id ASC ,attempts.updated_at DESC").select("DISTINCT ON (question_id) *")
  end

Ошибка: Этот метод возвращает повторяющиеся попытки. (все попытки для каждого вопроса этого пользователя). все 3 попытки q1 и все три попытки q2

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Похоже, у вас есть ненужное объединение в вашем запросе.

Вы должны быть в состоянии сделать следующее:

def questions_last_attempts
  attempts
    .select("DISTINCT ON (question_id) *")
    .order(:question_id, created_at: :desc)
end

, который должен генерировать следующий SQL:

SELECT DISTINCT ON (question_id) * FROM "attempts" WHERE "attempts"."user_id" = 1 ORDER BY "attempts"."question_id" ASC, "attempts"."created_at" DESC
1 голос
/ 20 марта 2019

Один из способов - добавить отношения между User и Question до Attempt.
. Затем сопоставьте идентификаторы user.questions, чтобы выбрать каждый раз при первой упорядоченной попытке:

class User < ApplicationRecord
  has_many :attempts
  has_many :questions, through: :attempts

  def last_attempts
    questions.order(:id).distinct.map do |question|
      attempts.where(question_id: question.id).order(updated_at: :desc).first
    end
  end
end
...