查询的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一个字面整数列表(当列表变大时它可能变慢)。
谢谢!如何将属于用户的所有组的所有微博保存在实例变量中?所以在我看来,我可以使用@microposts或类似的东西...... –
你是否需要将它们分组为'group'或者只是一个微阵列? – PinnyM
大阵.. –