2011-11-10 99 views
5

我不知道這是否有很好的答案。比方說,我有:Rails:獲取對象數組的關係

users = User.where(:location => "Utopia") #=> Returns [user1,user2,user3,user4] 

我想這樣做:

users.photos #=> Returns all photos this group of users has 

,簡單地讓所有的照片背面不反覆他們。我問,因爲每次迭代都是數據庫調用。有沒有什麼好的方法可以完成單個數據庫調用?

回答

5

最直接的方式做到這一點是使用急於裝載機:

users = User.where(:location => 'Utopia').includes(:photos) 

這將獲取一個合格的用戶,則關係及其相關照片在另一個。你可以用這一切到一個通話中,如果你要麼使用一個JOIN或子選擇,它是你的電話,但它會是這個樣子:

photos = Photo.includes(:user).where('users.location' => 'Utopia') 

有一個在Active Record Query Interface documentation第12條提供更多的信息。

+1

是的,做一個內部連接而不是LOJ會更有效率 - ''photos = Photo.joins(:user).where(:users => {:location =>'Utopia'})' – mnelson

+0

是否可以指定執行連接時要使用的密鑰?該關係通過':has_many:through'設置,並且返回使用錯誤的鍵集。 – Justin