Rails - 命名范围问题(取决于many_to_many关系中的子项数)

时间:2011-02-08 13:57:10

标签: sql ruby-on-rails activerecord count named-scope

假设我在用户和群组之间存在多对多的关系。用户可以是组的成员,或者他的应用程序仍然可以处于待处理状态。

class User < ActiveRecord::Base
  has_many :applications
  has_many :groups, :through => :applications
end

class Group < ActiveRecord::Base
  has_many :applications
  has_many :users, :through => :applications
end

class Application < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
  attr_accessible :pending # boolean : is the application still pending or not
end

我想在我的Group类中添加一个范围,以选择拥有超过10个非待定用户的组。

我可以得到这样的成员

Group.joins(:applications).where('applications.pending = ?', false)

但是我找不到足够的资源来制作计算此查询结果数量的范围,并返回此数字大于10的组

如果你有一个解决方案,或者对这个主题有资源,这对我有很大帮助

1 个答案:

答案 0 :(得分:2)

我没有在我自己的控制台中指出你的模型,但这些线路上的东西不会起作用吗?

Group.joins(:applications).group('groups.id').having('COUNT(*) > 10').where(["applications.pending = ?", false])

基本上,一旦在基础SQL中包含GROUP BY条件,就可以在聚合结果上使用HAVING。 WHERE只是将其限制为您正在寻找的结果。您可以使用直接SQL实现相同的结果:

Group.find_by_sql(["SELECT * FROM groups INNER JOIN applications ON applications.group_id = groups.id WHERE applications.pending = ? GROUP BY groups.id HAVING COUNT(*) > ?", false, 10])

包含在命名范围内的大量查询。您可能需要考虑将其分解为碎片 - 以后可能会节省很多麻烦......