假设我有 2 个模型:
class Person < ActiveRecord::Base
has_many :addresses
end
class Address < ActiveRecord::Base
belongs_to :person
end
我想得到所有恰好有 2 个地址的人。是否有一种简单的 ActiveRecord/Arel 方法可以使用子查询来执行此操作?我不想使用 counter_cache 来做到这一点。
假设我有 2 个模型:
class Person < ActiveRecord::Base
has_many :addresses
end
class Address < ActiveRecord::Base
belongs_to :person
end
我想得到所有恰好有 2 个地址的人。是否有一种简单的 ActiveRecord/Arel 方法可以使用子查询来执行此操作?我不想使用 counter_cache 来做到这一点。
这对我有用(使用 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
@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