2

私は :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でこれを試しました

ありがとう!

4

0 に答える 0