【问题标题】:Rails nested joins with a where containing a count on a nested join tableRails 嵌套连接,其中包含嵌套连接表上的计数
【发布时间】:2011-11-02 23:09:59
【问题描述】:

我在我的 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 不是我的强项之一,而且我今天似乎脑死了。

【问题讨论】:

    标签: sql ruby-on-rails-3 activerecord arel


    【解决方案1】:

    在为此苦苦挣扎后,我得到了一些帮助,并且能够像这样完成我的查询

    User.select("users.*, count(distinct contacts.id) as num").joins(:groups => :contacts).group('users.id').having('num > 10')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多