要獲得用戶的羣體:
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一個字面整數列表(當列表變大時它可能變慢)。
謝謝!如何將屬於用戶的所有組的所有微博保存在實例變量中?所以在我看來,我可以使用@microposts或類似的東西...... –
你是否需要將它們分組爲'group'或者只是一個微陣列? – PinnyM
大陣.. –