2012-03-07 44 views
1

我的應用程序有Question型號has_manyUserResponse型號。Rails 3:如何加載一個關聯,並使用includes()應用一個條件?

我想獲得特定User已回答的最後5個問題,並在user_id字段中過濾了相關聯的UserResponse對象。

這是我目前有:

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,所以我需要整個圖形可用。

+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和人們將複製和粘貼此代碼,比改變它和.. 所以這樣做更好:哪裏(「r.user_id =?」,user_id)。 –

+0

有關sql注入的更多信息,請看這裏 - http://guides.rubyonrails.org/security.html#sql-injection –

相關問題