2011-08-11 71 views
0

我有一個模型與任務,用戶和Wits。 WOW屬於任務和用戶。Rails急切的加載,包括和會話屬性

我想加載所有任務的列表並且爲特定用戶加載機智。 我需要做一個LEFT OUTER JOIN並向連接添加一個條件。 這裏是正在爲現在:

Mission.joins("LEFT OUTER JOIN wits ON wits.mission_id = missions.id AND wits.user_id = #{current_user.id}") 

然後在我的名單,我可以做mission.wits.first拿到屬於正確的用戶的智慧。

但它不是很友好的軌道,我必須檢查。屬性以避免在條件不滿足時加載所有智能。

有沒有更好的方法,希望使用示波器來完成工作?也許增加一個新的虛擬屬性給Mission,但是我想避免在每個列表上打20個電話給數據庫。

更新:最後我希望看到任務列表,以及每個任務的當前用戶的Wit狀態。我正在使用gem調用acts_as_api以JSON創建我的列表視圖,但是我無法訪問模型內​​部的會話變量,這就是爲什麼我正在查看這種熱切的加載內容,以加載所需的所有內容來自控制器。

感謝您的幫助

回答

0

爲什麼不這樣做

Wit.includes(:mission).where(:user_id => params[:user_id]) 

是否有你的使命時,查詢原因聽起來像你真的想要的智慧?此外,如果你確實想要一個相關任務的列表,你也可以這樣做:

Wit.includes(:mission).where(:user_id => params[:user_id]).select(&:mission).uniq 
+0

不,我真的很想要任務列表,我只想看看每個任務是否存在關聯機智,以及是否存在查詢狀態。 – rnaud

0

這應該爲你工作:

Mission.joins(:wits).where(:wits => { :user_id => params[:user_id] }) Or 
Mission.joins(:wits).where('wits.user_id' => params[:user_id]) 
+0

沒有這隻顯示了有兒童機智的任務。 我使用的查詢包含AND而不是WHERE條件。 (例如http://searchoracle.techtarget.com/answer/LEFT-OUTER-JOIN-with-ON-condition-or-WHERE-condition) – rnaud