根据特定关联列获取唯一记录 - rails 活动记录关联

getting unique records on the basis of specific associated column - rails active record associations

我有三个模型。 UserQuestionAttempt

每个 User has_many :attempts

同样,Question has_many :attempts

Attempt belongs_to UserQuestion

要求:

我想要的是一种方法 return 用户对每个问题的最后一次尝试,该问题与用户有关联的尝试。

我的意思是,如果用户尝试了 q1、q2 并且每个问题都有 3 次尝试,那么我的方法应该 return 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

错误: 此方法 return 次重复尝试。 (针对该用户的每个问题的所有尝试)。 q1 的所有 3 次尝试和 q2 的所有 3 次尝试

一种方法是通过AttemptUserQuestion之间添加关系。
然后每次第一次尝试时将 user.questions id 映射到 select:

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

您的查询中似乎有不必要的连接。

您应该能够做到以下几点:

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