查询的has_many的Rails

问题描述:

我有一个的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 

首先,我需要知道查询来获取用户的所有组,在那之后我需要一种方法来显示所有的这些群体的微博。是否有可能通过该信息获得一个查询?

非常感谢!

要获得用户的群体:

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

大阵.. –