我是一个控制器,我有一个带有连接的查询来防止1 + n问题:
@questions = Question.joins(:answers).where("answers.user_id = ?", user_id)
现在我想迭代视图中的问题并使用它们:
- @questions.each do |question|
- answer = question.answers.first
但结果是答案表被查询两次。如何从第一个连接查询中获得答案,因此我不需要第二个查询?
答案 0 :(得分:1)
@questions = Question.includes(:answers).where(answers: {user_id: user_id})
联接只允许在用户表上进行查询,它不会避免n + 1。使用includes告诉rails以急切加载答案,以避免它。
http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations
答案 1 :(得分:0)
您真的只想返回用户给出的答案,还是想要所有其他用户的答案?
假设前者,另一种方法可能是:
@questions = @user.answers.eager_load(:question).group_by{|answer| answer.question}
这会给你一个连接答案和问题的查询,然后group_by将返回一个哈希,其中键是问题,值是用户答案的数组。
如果您想要所有用户的所有答案,那么您需要来自用户的关联,为您提供他们已经回答的问题(has_many:questions_answered,通过:::answers,class_name:“question”),然后:
@questions = @user.questions_answered.include(:answers)