【问题标题】:Rails 4 "where"-query with "has_many belongs_to"-relationship, searching with specific countRails 4“where”-查询与“has_many belongs_to”-relationship,搜索特定计数
【发布时间】:2014-10-29 04:27:26
【问题描述】:

这应该是一个简单的查询,但我在正确使用 Rails 语法时遇到了问题。我正在使用 Rails 4.1.1 和 Postgresql(9.3)。我有一个模型用户和模型公司。用户有一个公司,公司有很多用户。我正在尝试查找所有拥有超过 5 个用户的公司。

class Company < ActiveRecord::Base
   has_many :users, dependent: :destroy
   ...

class User < ActiveRecord::Base
   belongs_to :company
   ...

问题类似这样:Find all records which have a count of an association greater than zero

如果我尝试上述类似的解决方案:

Company.joins(:users).group("company.id").having("count(users.id)>5")

它给了我一个错误:

PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "company"
LINE 1: ... "users"."company_id" = "companies"."id" GROUP BY company.id...

我已经尝试了几种不同的查询来获得结果,但我没有这样做。我可以使用 SQL,但这似乎很愚蠢,因为这应该可以通过 ActiveRecord 轻松实现。

感谢所有回复:)

【问题讨论】:

    标签: sql ruby-on-rails ruby postgresql activerecord


    【解决方案1】:

    应该使用"companies.id" 而不是"company.id"

    Company.joins(:users).group("companies.id").having("count(users.id)>5")
    

    如果你想获得 0 个用户的公司,你必须使用 LEFT JOIN:

    Company.joins('LEFT JOIN users ON companies.id = users.company_id').group("companies.id").having("count(users.id) = 0")
    

    【讨论】:

    • 我发誓我也试过了,我猜不是......非常感谢:)如果我正在尝试使用 0 个用户进行查询,它会以某种方式不起作用,查询如下: Company.joins(:users).group("companies.id").having("count(users.id)=0") 有一家公司有 0 个用户,但它仍然返回空 => #<:> 如果尝试使用 0 个用户进行搜索,是否应该采用不同的方式?
    • 我想知道为什么这个查询返回一个有 8 个用户的公司? 2.1.2p95 :115 > Company.joins('LEFT JOIN users ON Companies.id = users.id').group("companies.id").having("count(users.id) = 0").first. users.count => 8
    • 而不是LEFT JOIN,我认为在查询语法中看起来很难看,为什么不直接使用includes(:users),这将为您创建一个LEFT JOIN,看起来更干净。
    • @MatiasP 抱歉,加入条件有遗漏,现在应该可以了。
    【解决方案2】:

    当我试图寻找拥有超过 0 个用户的公司时,xdazz 提供的查询很有效(基本上是我在最初的帖子中提出的问题)。我找到了两种方法来搜索 0 个用户。一种是上面提到的方式:

    Company.joins('LEFT JOIN users ON companies.id = users.company_id')
    .group("companies.id").having("count(users.id) = 0")
    

    但是在Want to find records with no associated records in Rails 3 的帮助下,这是另一种方法:

    Company.includes(:users).where(:users => {company_id=>nil})
    

    【讨论】:

    • Company.joins('LEFT JOIN users ON companies.id = users.id') 应该是 Company.joins('LEFT JOIN users ON companies.id = users.company_id')
    • 对,我没有注意那里。我将编辑帖子以显示两种方式。
    猜你喜欢
    • 2022-07-08
    • 2014-10-23
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多