假设我在用户和群组之间存在多对多的关系。用户可以是组的成员,或者他的应用程序仍然可以处于待处理状态。
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的组
如果你有一个解决方案,或者对这个主题有资源,这对我有很大帮助
答案 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])
包含在命名范围内的大量查询。您可能需要考虑将其分解为碎片 - 以后可能会节省很多麻烦......