我对如何基于连接表中存在的额外字段查询多对多关系感到好奇。最好通过一个例子问。
我有一个模型用户,一个模型组。
多对多关系称为分组。它有一个额外的字段'active_user'。我想查询活动组中的所有用户。
如果我这样做:
@user.groupizations.find_all_by_active_user(true)
- 给我一个分组列表;但是,我会寻找一个用户列表。也许我需要做一些映射?
谢谢!
答案 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