2014-03-04 64 views
1

的更新特定的緩存計數器我有兩個簡單的模型:如何以及在哪裏關聯模型

class Offer < ActiveRecord::Base 
    belongs_to :offer_category 

    scope :visible, -> { where(visible: true) } 
end 

class OfferCategory < ActiveRecord::Base 
    has_many :offers 

    def recount_visible_offers 
    self.visible_offers_counter = offers.visible.count 
    save 
    end 
end 

我想緩存在每個類別中可見的報價數量。由於我只想計數可見報價,因此我無法使用Rails counter_cache。爲此,我在OfferCategory上提出了一個方法recount_visible_offers,它可以計算並保存我想要的內容。但是現在我被困在何處以及如何調用它。

使用的方法需要處理這些

  • 提供改變其可見屬性
  • 報價可見真正被刪除
  • 情況下,所有的變化

    1. 新的報價與屬性可見創建的計數器=真
    2. 優惠更改類別

    現在它使用after_save和afte處理r_destroy在相關類別實例上調用recount_visible_offers的回調,但考慮到上述所有情況,它相當複雜且容易出錯。另一件事是測試更難。

    所以我想改變它以某種方式更簡單。我有一個想法:
    OfferCategory上介紹方法self.recount_visible_offers,該方法在任何時候重新計算所有類別中的所有計數器(通過再次回調)。我知道它非常強大,但它更簡單,我在考慮在性能問題到來時處理,而不是現在創建或更改新產品的頻率不是很高,而且其中也不是很多。

    另一種方式可能是我正在調查的觸摸或關聯回調。

    任何建議將不勝感激。提前致謝。

    獎金的問題:
    你會在哪裏測試基於賣價漲跌類股獲正確敘述?我不確定它屬於單元測試,因爲它涉及2個類一起工作。另一方面,功能測試似乎太重,因爲我想測試以上所有情況。

    回答

    0

    我將它設置這樣的:

    編輯:這包括保持先前相關報價類別的軌道的輕微哈克的方式,所以,在舊的和新的計數器緩存領域可以調整。我也已經使用「更改」方法使它只在需要時才做。

    class Offer 
        belongs_to :offer_category 
        scope :visible, -> { where(visible: true) } 
        attr_accessor :previous_offer_category_id 
    
        before_update :store_previous_offer_category_id 
        after_save :update_offer_category_visible_offers_counters 
        after_destroy :update_offer_category_visible_offers_counters  
    
        def store_previous_offer_category_id 
        if self.changes["offer_category_id"] 
         self.previous_offer_category_id = self.changes["offer_category_id"][0] 
        end 
        end 
    
        def update_offer_category_visible_offers_counter 
        if self.previous_offer_category_id && self.previous_offer_category_id != self.offer_category_id 
         OfferCategory.find(self.previous_offer_category_id).update_visible_offers_counter 
        end 
        self.offer_category.update_visible_offers_counter 
        end 
    end 
    
    class OfferCategory 
        has_many :offers 
    
        def set_visible_offers_counter 
        self.visible_offers_counter = self.offers.visible.count 
        end 
    
        def update_visible_offers_counter 
        self.set_visible_offers_counter 
        self.save 
        end 
    
    end 
    
    +0

    類似的東西是我們的第一個鏡頭..問題是內改變類 - 它不更新舊的 – masa331

    +0

    啊 - 我看到:我會修改我的答案。 –

    相關問題