私は :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でこれを試しました
ありがとう!