Rails 3:如何急切加载关联并使用includes()应用条件?

时间:2012-03-07 02:24:56

标签: ruby-on-rails activerecord join eager-loading

我的应用拥有Question has_many型号的UserResponse型号。

我想获得特定User已回答的最后5个问题,以及在UserResponse字段上过滤的相关user_id个对象。

以下是我目前的情况:

Question.group("questions.id").
joins("inner join user_responses r on r.question_id = questions.id").
where("r.user_id = #{user_id}").
order("questions.id asc").limit(5)

这个查询让我得到了我想要的东西,但问题是当我从数组中得到Question并且question.user_responses结果是该问题的所有响应,而不仅仅是应该由上面的join / where子句过滤的那些。

我试过这样做:

Question.includes(:user_responses).group("questions.id").
joins("inner join user_responses r on r.question_id = questions.id").
where("r.user_id = #{user_id}").
order("questions.id asc").limit(5)

认为它会急切地加载每个响应......但它似乎没有那样的功能。

我哪里错了?

如果它有所不同,我需要急切加载所有内容的原因是因为我想获取数组并在其上调用to_json并从我的移动应用程序的Web服务返回json,所以我需要整个图表可用。

1 个答案:

答案 0 :(得分:1)

我认为你在这里试图变得过于复杂。以下怎么样?

Question
  .includes(:user_responses)
  .where("user_id = ?", user_id)
  .order("questions.id asc")
  .limit(5)