我在rails 3应用程序中设置了以下模型:
class User << AR::Base
has_many :groups
end
class Group << AR::Base
belongs_to :user
has_many :memberships
has_many :contacts, :through => :memberships
end
class Membership << AR::Base
belongs_to :group
belongs_to :contact
end
class Contact << AR::Base
has_many :memberships
has_many :groups, :through => :memberships
end
我正在尝试尽可能多地将此查询卸载到数据库中,但我正在尝试获取通过其(可能很多)组的联系人数超过x
的用户列表。
我可以通过ruby / rails代码执行此操作而不会出现任何问题,但它会将所有内容加载到内存中,这对于较大的数据集来说可能很痛苦。
x = 4 # or whatever
User.all.select{ |u| u.groups.collect(&:contacts).flatten.uniq.size > x }
我尝试过做类似以下的事情,但无济于事:
User.joins(:groups => :contacts).where('count(contacts.id) > ?', x)
此外,联系人也应该是独特的
正确方向上的任何一点都会很棒,sql不是我的优点之一,而且今天看起来我已经死了。
答案 0 :(得分:9)
经过一段时间的努力,我得到了一些帮助,并且能够最终确定我的查询
User.select("users.*, count(distinct contacts.id) as num").joins(:groups => :contacts).group('users.id').having('num > 10')