1

假设我有 2 个模型:

class Person < ActiveRecord::Base
  has_many :addresses
end
class Address < ActiveRecord::Base
  belongs_to :person
end

我想得到所有恰好有 2 个地址的人。是否有一种简单的 ActiveRecord/Arel 方法可以使用子查询来执行此操作?我不想使用 counter_cache 来做到这一点。

4

2 回答 2

3

这对我有用(使用 Rails 3,PostGreSQL):

Patient.joins(:interventions).group('patients.id').having('count(patient_interventions.id) = 2')

在您的情况下,以下内容应返回恰好具有 2 个地址的人员:

Person.includes(:addresses)
      .select('persons.*')
      .group('persons.id')
      .having('count(addresses.id) = 2')
# Note use :joins instead of :includes if you don't want the addresses data
于 2012-12-14T17:33:57.373 回答
0

@MrYoshiji 的回答很好,但有时您可能更喜欢做两个查询。另一种方法:

person_ids = Address.select('person_id, count(person_id) as cnt').group('person_id').having('cnt = 2').pluck(:person_id)
Person.find person_ids
于 2012-12-14T17:39:24.377 回答