1

我有一个 has_many 虽然这样的关联:

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

1 回答 1

5

获取用户组:

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})

由于两个原因,第二种方法更快 - 它只需要一个查询(不需要急切加载)并且数据库查找更有效,因为它可以使用可用索引来执行必要的连接而不是过滤文字整数列表(其中随着列表变大可能会变慢)。

于 2013-05-21T02:38:01.040 回答