Rails 4中使用“has_many belongs_to”关系的“where”查询,按特定数量搜索

3
这应该是一个简单的查询,但我在使用Rails 4.1.1和Postgresql(9.3)时无法正确编写Rails语法。我有一个用户(User)模型和一个公司(Company)模型。用户拥有一个公司,而公司拥有多个用户。我正试图找到所有拥有超过5个用户的公司。
class Company < ActiveRecord::Base
   has_many :users, dependent: :destroy
   ...

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

问题类似于这个:查找所有关联计数大于零的记录

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

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应该很容易实现。 感谢所有的回复 :)
2个回答

7
应该使用"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") 虽然存在没有任何用户的公司,但仍会返回空值=> #<ActiveRecord::Relation []> 如果要搜索0个用户,应该有其他方法吗? - mpartan
我想知道为什么这个查询会返回一个有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 - mpartan
为什么不使用includes(:users),而不是在查询语法中使用看起来很丑的LEFT JOIN呢?这将为您创建一个LEFT JOIN,并且看起来更加清晰。 - engineersmnky
@MatiasP 对不起,加入条件有误,现在应该可以工作了。 - xdazz

1

xdazz提供的查询适用于我想要查找拥有超过0个用户的公司(基本上就是我在最初的帖子中所要求的)。我发现了两种搜索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') - xdazz
好的,我没有仔细注意到那个。我会编辑帖子以展示两种方式。 - mpartan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,