Rails 3: Как быстро загрузить ассоциацию и применить условие с помощью include ()? - PullRequest
1 голос
/ 07 марта 2012

Мое приложение имеет Question моделей, которые has_many UserResponse моделей.

Я бы хотел получить последние 5 вопросов, на которые конкретный User ответил с соответствующими 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 и верните json из веб-службы для моего мобильного приложения, поэтому мне нужен весь график.

1 Ответ

1 голос
/ 07 марта 2012

Я думаю, ты здесь слишком усложняешься. Как насчет следующего?

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