2011年10月11日

counter_cache (Rails3.1)のspec

Railsのアソシエーションの数を自動的に数えてくれるというしくみ=counter_cacheで、なんだか悩みました。
今でもよく分からない状態。

どうやってテストすればいいんだろう。。。

プロジェクトを適当に二つ作って、最初の方にメンバーを追加する、と。
そうすると、p.members_countが一つ減っていないといけないと思うんだけど、p.members_countはもともとゼロなんだそうです。


it "increment counter_cache when project has changed" do
p = Factory(:project)
p2 = Factory(:project)
m = p.members.create(:name => 'abc')
lambda do
put :update, :id => m, :project_id => p2
end.should change(@, :issues_count).by(-1)
end


ちなみに、counter_cacheのアップデート部分はこんな感じが今のところちゃんと動きます。
update_countersは使えなくなったのか、なんだか挙動不審。
increment/decrement_counterが中でupdate_countersを呼んでいるので、この方が正しい使い方のようです。
belongs_to :project, :counter_cache => true
before_save :update_counters

private
def update_counters
new_project = Project.find self.project_id
Project.increment_counter(:issues_count, new_project)
if self.project_id_was.present?
old_project = Project.find self.project_id_was
Project.decrement_counter(:issues_count, old_project)
end
end

0 件のコメント: