2013-12-20 24 views
2

所以...我有3個模型。總結在一起counter_caches

class Foo < ActiveRecord::Base 
    has_many :bars 
end 

class Bar < ActiveRecord::Base 
    belongs_to :foo 
    has_many :bazs 
end 

class Baz < ActiveRecord::Base 
    belongs_to :bar, counter_cache: true 
end 

所以,我想,而不是.size我美孚其行爲類似bars_count,但我想補充Barbazs_count一起列。我是否必須在此處進行手動操作,使用before_save還是什麼? Rails中是否有這個功能?

所以,如果有2個酒吧... 1有一個bazs_count = 4,另一個與bazs_count = 8。如果這兩個條都屬於foo,則只要bazs_count發生更改,我就想要bars_count = 12

原因......我經常會檢查一個特定的foo有多少個bazs,我想保持最小的查詢。

+0

不,你不得不自己手動做這個。 –

+0

k ...所以當'counter_cache'更新吧時,它實際上並沒有保存,所以我的Bar'after_save'調用不會觸發。如果我之後'Bar.find(1).save',那麼它會正確更新Foo。應該如何觸發? – Dudo

回答

1

您可以將以下方法添加到您的Baz模型中,以增加和減少Foo模型中的bazs_count列。我發現Rails將bazs變成了bazs,而不是bazes。

class Foo < ActiveRecord::Base 
    has_many :bars 
end 

class Bar < ActiveRecord::Base 
    belongs_to :foo, counter_cache: true 
    has_many :bazs 
end 

class Baz < ActiveRecord::Base 
    belongs_to :bar, counter_cache: true 

    after_create :increment_foo_counter 
    after_destroy :decrement_foo_counter 

    private 

    def increment_foo_counter 
    Foo.increment_counter(:bazs_count, bar.foo_id) 
    end 

    def decrement_foo_counter 
    Foo.decrement_counter(:bazs_count, bar.foo_id) 
    end 
end 
+0

釘住它。我嘗試了一些重寫counter_cache方法的其他時髦方法。這正是我所追求的,非常感謝你!看到'.increment_counter'方法在運行,以及它如何被調用是很酷的。 – Dudo

+0

就此而言......如果我想,我實際上可以刪除Baz上的'counter_cache',如果我不打算叫它。非常好。 – Dudo