2012-03-03 82 views
1

是否可以使用動態條件執行熱切加載?更具體地講:動態條件下的急切加載

u_id = params[:user_id] 
Container.includes(:items).where("items.user_id =?", u_id) 

這顯然不給我所有的容器但具有一定的user_id唯一項目,因爲它適用的where條件,整個查詢,而不僅僅是:items,但有沒有辦法實現這使用ARel,還是它需要一個自定義的SQL查詢?

回答

0

只需撥打scoped您的查詢:

Container.where("items.user_id =?", u_id).includes(:items).scoped 

這將返回一個阿雷爾對象,而不是數據庫查詢。

Rails Console中試用它,你可以看到創建的Arel對象與運行它時沒有scoped

+0

這讓我更好地瞭解範圍。此時查詢只返回包含項目的容器。是否可以爲給定用戶加載項目並獲取所有容器,即使它們不包含任何項目? – Stefan 2012-03-04 03:36:57

+0

如果你在容器上有user_id,那麼它會相對容易。 'Container.where(「user_id =?」,params [:user.id]).include(:items).scoped'這將選擇給定用戶的所有容器,然後包括與選定容器相關的項目。如果你在容器上沒有'user_id',那麼我的頭上就沒有答案了。如果我再找到任何東西,我會發布它。 – nmott 2012-03-04 06:59:35

+0

感謝您的幫助。我會嘗試修改設計,也許這是造成我的困難的原因。目前,所有'Users'都可以在這些容器中獲得所有'Containers',但只有他們的'Items'。我已經在視圖中使用了一些邏輯,但它引起了令人愉快的N + 1查詢問題。 – Stefan 2012-03-04 15:22:51