2012-09-11 62 views
0

我有一個模型用戶,其中有許多照片。Rails加入(包括)belongs_to模型

我需要得到用戶的飼料(照片來自其他用戶,用戶應包括在內),所以查詢將是:

Photo.where(:user_id => Relationship.select(:followed_id).where(:follower_id => user.id)<<user.id).joins(:user) 

但我得到的只有照片,沒有用戶信息。是否有可能使查詢返回是這樣的:

({user:{},photo:{}},{user:{},photo:{}},{user:{},photo:{}}) 
+0

可能只是將'joins'切換到'includes'。出於好奇,它輸出的查詢是什麼?不得不承認,我還沒有嘗試過將另一個ARel查詢傳遞給where方法。 – agmcleod

+0

它只返回照片。當我使用包括,它使2查詢,一個照片和第二個 - 從用戶中選擇。它看起來也很棒,但它也只返回照片。這看起來很奇怪。 –

回答

3

重要的是要理解此處是通過使用包括導軌直接從數據庫返回原始模型(在這種情況下,照片),而且還加載到內存中,其可以通過查詢所有相關的用戶模型照片。這種方法假定數據庫查詢時間很昂貴,並且花費內存空間/ CPU時間更有效。

實際上這意味着你執行你的查詢後:

@photos = Photo.where(:user_id => Relationship.select(:followed_id).where(:follower_id => user.id)<<user.id).includes(:user) 

您可以運行:

@photos.first.user 

這不會去到DB用戶,但是從內存中加載它(這被認爲是便宜的)。因此,當您需要照片的用戶時,您只需運行其user方法即可,無需將其預先組織在({user:{},photo:{}},{user:{},photo:{}},{user:{},photo:{}})結構中 - 只需在需要時加載用戶即可。

如果由於某種原因,你必須將其安排在您可以將這個特定的方式:

@photos = Photo.where(:user_id => Relationship.select(:followed_id).where(:follower_id => user.id)<<user.id).includes(:user) 

@photos = @photos.map {|p| {:user => p.user, :photo => p} 

這將返回一個包含照片和用戶哈希值的數組。

+0

謝謝!很好的解釋! –

0

基於您的評論,你可能需要鏈接查詢的一個水平,應該傳遞導致另一種方法按你的原職。這完全沒有經過測試,但我認爲它是在你需要實現的方向上。這個想法是你得到當前用戶是追隨者的所有關係對象。然後你包含用戶對象,名爲follower。該符號可能需要更改,具體取決於您在關係模型中如何定義belongs_to。從那裏你包括照片。

根據生成的查詢,它可能會引發錯誤。如果是這樣,請將符號切換爲字符串,並指定表名稱。如果您在嘗試這樣做時遇到錯誤,請使用堆棧跟蹤編輯您的問題。

Relationship.where(:follower_id => user.id).includes(:follower).includes(:photos)