Rails 3: Как да заредите с нетърпение асоциация И да приложите условие с include()?

Приложението ми има 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 от уеб услуга за моето мобилно приложение, така че имам нужда от цялата налична графика.


person omgwot    schedule 07.03.2012    source източник
comment
Защо се опитвате да групирате тук?   -  person rwilliams    schedule 07.03.2012


Отговори (1)


Мисля, че се опитваш да станеш твърде сложен тук. Какво ще кажете за следното?

Question
  .includes(:user_responses)
  .where("user_id = ?", user_id)
  .order("questions.id asc")
  .limit(5)
person rwilliams    schedule 07.03.2012
comment
да, прав си. Мисля, че заявката беше по-сложна и вместо просто да подходя към проблема от нулата, се опитах да масажирам стария код. Благодаря ви много за бързия и точен отговор. - person omgwot; 07.03.2012
comment
Трябва да споменем, че имате потенциално sql инжектиране с параметър user_id. Разбира се, че няма да го направите, но това е stackoverflow и хората ще копират и поставят този код, отколкото да го променят и... Така че по-добре направете това: where(r.user_id = ?, user_id). - person Alexey Morozov; 07.05.2012
comment
За повече информация относно sql инжектирането вижте тук - guides.rubyonrails.org/security.html#sql - инжекция - person Alexey Morozov; 07.05.2012
comment
r не е дефиниран. Вместо това трябва да бъде user_responses.user_id. - person RocketR; 02.10.2012
comment
Добро обаждане. Мисля, че мога да бъда просто user_id, защото е недвусмислен. - person rwilliams; 03.10.2012