2013-05-21 62 views
0

我有一個的has_many雖然這樣的聯想:查詢的has_many的Rails

User.rb 
has_many :memberships, :dependent => :destroy 

has_many :groups, :through => :memberships 

Group.rb 
has_many :users, :through => :memberships 
has_many :microposts 


Membership.rb 
belongs_to :user 
belongs_to :group 

首先,我需要知道查詢來獲取用戶的所有組,在那之後我需要一種方法來顯示所有的這些羣體的微博。是否有可能通過該信息獲得一個查詢?

非常感謝!

回答

4

要獲得用戶的羣體:

some_user = User.find(some_id) 
some_user.groups 

要獲得微觀柱,你可以這樣做:

some_user.groups.each do |group| 
    puts group 
    puts group.microposts 
end 

然而,這會導致生成一個單獨的查詢,收集每個微柱組。這可以通過固定渴望加載使用includes的微觀柱:

some_user.groups.includes(:microposts).each do |group| 
    puts group 
    puts group.microposts 
end 

現在只有2查詢將產生 - 一個去取組和一個獲取與這些團體相關聯的所有微柱。在幕後,ActiveRecord會將microposts與正確的組相匹配,並在組上調用.microposts時相應地返回它們。

要獲得所有微柱作爲哈希,你可以使用each_with_object收集它們:

@group_microposts = some_user.groups.includes(:microposts). 
           each_with_object({}){|group, h| h[group] = group.microposts} 

這將在形式{ group => microposts }返回一個哈希值。

爲了讓他們作爲一個數組,你可能只是做:

@microposts = some_user.groups.includes(:microposts).map(&:microposts).flatten 

然而,有一個更有效的方法來做到這一點,如果你不需要的組信息在所有:

@microposts = Micropost.joins(:group => :users).where(:users => {id: some_user.id}) 

該第二方法是更快,因爲2個原因 - 它僅需要一個單一的查詢(沒有急切裝載需要)和DB查找是更有效的,因爲它可以使用可用的索引來執行必要的連接,而不是濾波器AGA inst一個字面整數列表(當列表變大時它可能變慢)。

+0

謝謝!如何將屬於用戶的所有組的所有微博保存在實例變量中?所以在我看來,我可以使用@microposts或類似的東西...... –

+0

你是否需要將它們分組爲'group'或者只是一個微陣列? – PinnyM

+0

大陣.. –