2011-02-08 41 views
1

假设我在用户和组之间有多对多的关系。用户可以是一个组的成员,或者他的应用程序仍然可以处于等待状态。Rails - 命名范围问题(取决于many_to_many关系中的子项数)

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

如果你有一个解决方案,或ressources关于这个主题,这会对我们帮助很大

回答

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]) 

一种巨大的查询以包含在命名范围中。你可能想考虑把它分解成碎片 - 这可能会在以后节省很多麻烦......

+0

工程很棒。谢谢! – MrRuru 2011-02-09 02:16:03