根据特定关联列获取唯一记录 - rails 活动记录关联
getting unique records on the basis of specific associated column - rails active record associations
我有三个模型。 User
、Question
和 Attempt
。
每个 User has_many :attempts
、
同样,Question has_many :attempts
和Attempt belongs_to User
和Question
要求:
我想要的是一种方法 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 次尝试
一种方法是通过Attempt
在User
和Question
之间添加关系。
然后每次第一次尝试时将 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
我有三个模型。 User
、Question
和 Attempt
。
每个 User has_many :attempts
、
同样,Question has_many :attempts
和Attempt belongs_to User
和Question
要求:
我想要的是一种方法 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 次尝试
一种方法是通过Attempt
在User
和Question
之间添加关系。
然后每次第一次尝试时将 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