Я реализовал отношение 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
Спасибо!