2012-03-07 1 views
1

Мое приложение имеет Question модели, которые has_manyUserResponse модели.Rails 3: Как запросить загрузку ассоциации И применить условие с include()?

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

+0

Почему вы пытаетесь присоединиться к группе? – rwilliams

ответ

1

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

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

да, вы правы. Я думаю, что запрос был более сложным и вместо того, чтобы просто подходить к проблеме с нуля, я пытался массировать старый код. Большое вам спасибо за ваш быстрый и точный ответ. – omgwot

+1

Следует упомянуть, что у вас есть потенциальная инъекция sql с параметром user_id. Конечно, вы не будете, но это будет stackoverflow, и люди скопируют и вставляют этот код, а затем меняют его и ... Так лучше сделайте это: where ("r.user_id =?", User_id). –

+0

Для получения дополнительной информации о sql injection см. Здесь - http://guides.rubyonrails.org/security.html#sql-injection –

Смежные вопросы