获取用户组:
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
组时相应地返回它们。
要将所有微博作为散列获取,您可以使用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})
由于两个原因,第二种方法更快 - 它只需要一个查询(不需要急切加载)并且数据库查找更有效,因为它可以使用可用索引来执行必要的连接而不是过滤文字整数列表(其中随着列表变大可能会变慢)。