2011-02-16 42 views
5

我正在嘗試從其他模型的用戶表中增加一個計數器。模型中的Ruby on Rails增量計數器

class Count < ActiveRecord::Base 
    belongs_to :user 

    after_create :update_count 

    def update_count 
     user = User.find(self.user_id) 
     user.increment(:count) 
    end 

end 

所以當創建計數時,目標是增加該用戶的計數器列。目前它拒絕在創建後獲得用戶,並且我得到一個零錯誤。

我使用的設計爲我的用戶

這是做正確的(最佳實踐)的地方嗎?我曾在控制器中工作,但想要清理它。

我對模型回調很不熟悉。

+0

您可以添加用於創建Count對象的代碼嗎?你可能想要包括你的目標或商業案例,或者準備許多試圖重構你正在做的事情的答案。 – gmoore 2011-02-16 16:29:22

+0

我明白了,我想概括一下模型並使情況變得簡單。用戶has_many計算每個用戶條目的哪個列在跟蹤創建時的計數(user.count)。 – febs 2011-02-16 17:59:03

回答

11

如果User有許多CountsCount屬於User(就像它似乎是),那麼你可能想使用counter cache。它完全按照你想要做的,它是內置到ActiveRecord中的。

0

我認爲一個更好的地方是使用observer來偵聽User對象的on_create,然後運行這個邏輯。

喜歡的東西:

class UserObserver < ActiveRecord::Observer 
    def after_create(user) 
    Counter.find_by_name("user_count").increment 
    end 
end 
+0

有趣的解決方案,我會試用計數器緩存和觀察者。 – febs 2011-02-16 18:01:59

0

如果您想要更多可擴展計數器緩存,請查看counter_culture。它支持基本的計數器緩存功能,但也允許您創建滿足各種條件的記錄計數器。例如,您可以使用如下代碼輕鬆創建非活動用戶數:

class Product < ActiveRecord::Base 
    belongs_to :category 
    counter_culture :category, :column_name => \ 
    Proc.new {|model| model.inactive? ? 'inactive_count' : nil } 
end