1

我对如何根据连接表中存在的额外字段查询多对多关系很感兴趣。最好通过一个例子来询问。

我有一个模型User和一个模型Group

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

如果我做:

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

谢谢!

4

2 回答 2

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(','))

于 2013-01-09T22:44:48.640 回答
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
于 2013-01-09T22:59:26.007 回答