我已经使用 :counter_cache => true 实现了 belongs_to 关系,我注意到如果在初始保存之前没有设置关系,计数器缓存不会得到更新。
例如,假设一家公司有很多员工。如果我做
company.employees << Employee.new(:name => "Joe")
计数器得到正确更新,但如果我这样做
company.employees << Employee.create(:name => "Joe")
计数器保持不变。
有关更多详细信息,请参阅以下型号:
class Employee < ActiveRecord::Base
belongs_to :company, :counter_cache => true
end
class Company < ActiveRecord::Base
has_many :employees
end
这是一个 Rails 控制台会话,它演示了这一点:
Loading development environment (Rails 3.0.5)
ruby-1.9.2-p180 :001 > company_a = Company.create(:name => "ACME")
=> #<Company id: 1, name: "ACME", created_at: "2011-07-22 01:31:39", updated_at: "2011-07-22 01:31:39", employees_count: 0>
ruby-1.9.2-p180 :002 > company_a.employees << Employee.new(:name => "Bob")
=> [#<Employee id: 1, company_id: 1, name: "Bob", created_at: "2011-07-22 01:31:59", updated_at: "2011-07-22 01:31:59">]
ruby-1.9.2-p180 :003 > company_a.reload
=> #<Company id: 1, name: "ACME", created_at: "2011-07-22 01:31:39", updated_at: "2011-07-22 01:31:39", employees_count: 1>
ruby-1.9.2-p180 :004 > company_a.employees << Employee.create(:name => "Joe")
=> [#<Employee id: 1, company_id: 1, name: "Bob", created_at: "2011-07-22 01:31:59", updated_at: "2011-07-22 01:31:59">, #<Employee id: 2, company_id: 1, name: "Joe", created_at: "2011-07-22 01:32:28", updated_at: "2011-07-22 01:32:28">]
ruby-1.9.2-p180 :005 > company_a.reload
=> #<Company id: 1, name: "ACME", created_at: "2011-07-22 01:31:39", updated_at: "2011-07-22 01:31:39", employees_count: 1>
文档确实说在创建/销毁对象时计数器会增加/减少,但我认为它也应该监视更新以使其有用。否则,比如说,在公司之间调动员工很快就会导致柜台完全关闭。
这是预期的行为吗?如果是这样,理由是什么?如果没有,我是不是做错了什么?我在 Rails 3.0.5 和 Ruby 1.9.2 中试过这个
谢谢!