开发者

Rails ActiveRecord :counter_cache not updated if assocation not set up before create. Intentional?

开发者 https://www.devze.com 2023-03-21 20:14 出处:网络
I\'ve implemented a belongs_to relation with :counter_cache => true and I notice that the counter cache does not get updated if the relation was not set up before the initial save.

I've implemented a belongs_to relation with :counter_cache => true and I notice that the counter cache does not get updated if the relation was not set up before the initial save.

For instance, say a company has_many employees. If I do

company.employees << Employee.new(:name => "Joe")

The counter gets updated correctly but if I do

company.employees << Employee.create(:name => "Joe")

The counter remains unchanged.

For more details, here are the models:

class Employee < ActiveRecord::Base
  belongs_to :company, :counter_cache => true
end

class Company < ActiveRecord::Base
  has_many :employees
end

And here's a Rails Console session that demonstrates this:

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开发者_JAVA技巧")
 => [#<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> 

The documentation does say that the counter is incremented/decremented when the object is created/destroyed but I was thinking it should monitor updates as well to be useful. Otherwise, say, moving employees between companies would quickly result in counters that are totally off.

Is this the expected behavior? If so, what's the rationale? And if not, am I doing something wrong? I tried this in Rails 3.0.5 and Ruby 1.9.2

Thanks!

0

精彩评论

暂无评论...
验证码 换一张
取 消