2011-05-02 47 views
6

這是一個棘手的問題。Rails 3:只有在發佈時更新counter_cache

我有一個具有多種內容類型的項目,比如文章,評論等。每個內容類型都有評論,評論是多態的,因爲他們可以屬於任何內容類型。

我想在我的所有內容頁面上放置一個總評論計數器,以顯示有多少評論,並且我實現了一個計數器緩存來完成此操作。 (就像@ article.comments.count是更多的查詢,並且因爲我使用Ancestry gem進行線程評論,所以子註釋不包括在該數字中,只包括根數。)

計數器緩存效果很好,並顯示準確的評論數量,但一如既往,有一點點抓住。評論並不總是立即發佈,只有註冊用戶才能立即發佈,而這些評論的狀態爲'2'。未註冊的用戶可以進入審覈隊列;這些評論具有:狀態'1'。

問題是,計數器計數緩存它們都是一樣的,所以如果你有節制和一個評論被批准四條意見,總計數爲5

有沒有一種方法來添加一個例外到櫃檯如果comment.status不是'2',緩存告訴它不增加?同樣,當在評論資源中的後端,並設置發佈評論(給它的狀態2),有沒有一種方法(模型,控制器或其他),使計數器緩存它相關的多態/內容類型增量?

comments.rb

# Comments 
has_many :comments, :as => :commentable, :dependent => :destroy 
accepts_nested_attributes_for :comments 

article.rb

belongs_to :commentable, :polymorphic => TRUE, :touch => TRUE, :counter_cache => TRUE 

回答

5

我能想到的此刻,你可能必須提供模型和增量你自己的計數器緩存列/根據需要遞減。即

active_comments_count 
pending_comments_count 

然後在你的模型,你可以通過callback觸發update_comment_count方法。

它更多的努力在你身邊,但我相信這種方法將起作用。

+0

想了一會兒,我想你是對的。我甚至可能會更進一步,放棄計數器緩存,並使用完整提交的評論和已發佈的評論欄。原因在於,我計劃在某一天實施社區信譽系統,並且發佈到總體比率將會非常有幫助。謝謝。 – Shannon 2011-05-04 19:22:52

+0

很高興我能幫到你 – 2011-05-05 16:26:02