[英]Creating a SCOPE for an association with more than 3 models - Rails 4
[英]Rails association scope for “more than one associated object”
给定两个相关模型
class Employee < ActiveRecord::Base
belongs_to :company
end
class Company < ActiveRecord::Base
has_many :employees
end
我如何在“公司”范围内设置范围,以使其返回拥有一名以上员工的任何公司?
Rails 3,DB是postgres。
提前致谢
您可以添加如下查询方法:
class Company < ActiveRecord::Base
has_many :employees
def self.with_employees(cnt = 1)
select('companies.*, count(employees.id) as employee_count')
.joins(:employees)
.group('companies.id')
.having('count(employees.id) > ?', cnt)
end
end
这将使您能够像这样调用方法: Customer.with_employees(2)
并进行动态比较(例如,公司的员工人数多于2,而不是1)。
或者,查看添加一个counter_cache列,该列将使您的Employee类看起来像这样:
class Employee < ActiveRecord::Base
belongs_to :company, counter_cache: true
end
counter_cache将需要在company表上另外增加一个名为employees_count
,并且每次添加/删除员工时都会增加/减少。
counter_cache方法将减少SQL查询的影响并使其更易于查询,但是如果直接添加记录(即不通过Rails应用程序),则维护它可能是一个问题。
有关使用“具有”的ActiveRecord查询的文档,请参见此文件: http : //guides.rubyonrails.org/active_record_querying.html#having
有关添加counter_cache的详细信息,请参见: http : //guides.rubyonrails.org/association_basics.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.