Rails:如何基于多对多关系中的额外字段进行查询?

时间:2013-01-09 22:38:07

标签: ruby-on-rails many-to-many associations

我对如何基于连接表中存在的额外字段查询多对多关系感到好奇。最好通过一个例子问。

我有一个模型用户,一个模型

多对多关系称为分组。它有一个额外的字段'active_user'。我想查询活动组中的所有用户。

如果我这样做:

@user.groupizations.find_all_by_active_user(true) - 给我一个分组列表;但是,我会寻找一个用户列表。也许我需要做一些映射?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以通过将关联加入查询,然后在关联表的范围内搜索来完成此操作:

User.joins(:groupizations).where(:groupizations => {:active_user => true})

请注意,如果多个分组符合此条件,则会返回重复的行。要获得不同的用户,您可以执行以下操作之一:

  • 使用.select("DISTINCT users.*")的某个ORDER子句添加对.order("users.id")的调用(根据需要更改排序列)
  • 添加如下的GROUP BY子句:.group("users.id")。对于非MySQL数据库,您可能需要更具体,并包括分组中的所有列:

    .group(User.column_names.map{|c| "users.#{c}"}.join(','))

答案 1 :(得分:0)

在连接表上有一个额外的字段,你应该使用has_many:through而不是has_many_to_many。它使用相同的API

做更多事情
class User
  has_many :groupizations
  has_many :groups, through: groupization

  scope :active, joins(:groupizations).where("groupizations.active_user='1'")
end

# controller
@active_users = User.active