Rails关联范围“多个关联对象”

时间:2014-07-23 16:27:20

标签: ruby-on-rails postgresql

给出两个相关模型

class Employee < ActiveRecord::Base
  belongs_to :company
end

class Company < ActiveRecord::Base
  has_many :employees
end

我如何在&#34;公司&#34;所以它会归还任何拥有多名员工的公司?

Rails 3,DB是postgres。

提前致谢

1 个答案:

答案 0 :(得分:1)

您可以添加如下查询方法:

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需要名为employees_count的公司表上的附加列,并且每次添加/删除员工时都会增加/减少。

counter_cache方法会降低SQL查询的影响并使查询更容易,但如果您直接添加记录(即不通过Rails应用程序),则可能是维护它的问题。

有关使用'having'的ActiveRecord查询的文档,请参阅此处: http://guides.rubyonrails.org/active_record_querying.html#having

这是关于添加counter_cache的详细信息: http://guides.rubyonrails.org/association_basics.html