我的Rails 3應用程序有兩個模型,第三個是它們和has_many關係之間的連接表。基本上,用戶和顯示由SavedShow加入,讓用戶保存節目的列表:counter_cache在ActiveReord中的has_many關聯不會遞減
class Show < ActiveRecord::Base
has_many :saved_shows
has_many :users, :through => :saved_shows
end
class User < ActiveRecord::Base
has_many :saved_shows
has_many :shows, :through => :saved_shows
end
class SavedShow < ActiveRecord::Base
belongs_to :user, :counter_cache => :saved_shows_count
belongs_to :show
end
我已經注意到,counter_cache場(shows_saved_count)被自動遞增就好了,但不會減少。這個問題的核心似乎是從給用戶的列表顯示了通過刪除完成,這不會觸發counter_cache的更新:
current_user.shows.delete(@show)
不過,我不能在這裏調用destroy方法,因爲這不僅刪除了SavedShow中的User/Show關聯,而且還刪除了Show對象本身,這不是我想要的。
在這種情況下counter_cache是否不合適?
似乎有一個discussion作爲2009年的錯誤,並討論了修復,但我仍然在最新的Rails 3.0中看到這個問題。
我只會在模型中編寫我自己的自定義處理,但似乎沒有after_delete回調,我可以掛鉤(大概是這個原因,遞減不起作用)。現在,在我自己的代碼中只有一個地方可能會發生關聯刪除,所以我只需手動進行調用來更新計數器,但這看起來像ActiceRecord與counter_cache關聯的基本缺陷或錯誤,我想知道如果我不只是失去了一些東西。
如果這確實是counter_caches的真正問題,那麼最好的解決方法是什麼?
謝謝,凱恩。我還沒有機會嘗試過,但它看起來很有幫助。 – 2010-11-23 00:46:26