Rails ActiveRecord: counter_cache не обновляется, если связь не была создана до создания.Преднамеренное? - PullRequest
2 голосов
/ 21 июля 2011

Я реализовал отношение own_to с: counter_cache => true, и я заметил, что кэш счетчика не обновляется, если отношение не было установлено до первоначального сохранения.

Например, скажем, aКомпания имеет множество сотрудников.Если я делаю

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

Спасибо!

...