使用来自联接查询的数据

时间:2015-04-20 11:37:03

标签: ruby-on-rails activerecord

我是一个控制器,我有一个带有连接的查询来防止1 + n问题:

@questions = Question.joins(:answers).where("answers.user_id = ?", user_id)

现在我想迭代视图中的问题并使用它们:

- @questions.each do |question|
  - answer = question.answers.first

但结果是答案表被查询两次。如何从第一个连接查询中获得答案,因此我不需要第二个查询?

2 个答案:

答案 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)