2010-10-11 59 views
3

我的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的真正問題,那麼最好的解決方法是什麼?

回答

1

同樣的問題,但在Rails 2.3上。 值得注意的是,還加入了觸摸,如:

belongs_to :user, :counter_cache => :saved_shows_count, :touch => true 

不會更新計數器緩存也不是相關的updated_at領域上association.delete(對象)。

要解決這個問題,我們通常會操縱連接模型,但這也有一些缺點。

補丁是這裏:https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2824-patch-has_many-through-doesnt-update-counter_cache-on-join-model-correctly#ticket-2824-18

+0

謝謝,凱恩。我還沒有機會嘗試過,但它看起來很有幫助。 – 2010-11-23 00:46:26