我对如何根据连接表中存在的额外字段查询多对多关系很感兴趣。最好通过一个例子来询问。
我有一个模型User和一个模型Group。
多对多关系称为Groupization。它有一个额外的字段'active_user'。我想查询一个组中所有活跃的用户。
如果我做:
@user.groupizations.find_all_by_active_user(true)
- 给我一个分组列表;但是,我会寻找用户列表。也许我需要做一些映射?
谢谢!
我对如何根据连接表中存在的额外字段查询多对多关系很感兴趣。最好通过一个例子来询问。
我有一个模型User和一个模型Group。
多对多关系称为Groupization。它有一个额外的字段'active_user'。我想查询一个组中所有活跃的用户。
如果我做:
@user.groupizations.find_all_by_active_user(true)
- 给我一个分组列表;但是,我会寻找用户列表。也许我需要做一些映射?
谢谢!
您可以通过将关联加入查询来执行此操作,然后在关联表的范围内进行搜索:
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(','))
对于连接表上的额外字段,您应该使用 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