模型中的Ruby on Rails增量计数器

时间:2011-02-16 16:25:25

标签: ruby-on-rails model callback

我正在尝试从另一个模型中增加User表中的计数器。

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

因此,当创建count时,目标是为该用户增加一个计数器列。目前它拒绝在创建后获得用户,我得到一个零错误。

我正在为我的用户使用设计

这是最合适的(最佳做法)吗?我让它在控制器中工作,但想要清理它。

我对模型回调非常缺乏经验。

3 个答案:

答案 0 :(得分:11)

如果User有许多CountsCount属于User(似乎是),那么您可能需要使用counter cache。它完全符合您的要求,并且内置于ActiveRecord中。

答案 1 :(得分:0)

我认为更好的地方是使用监听User对象的on_create的observer,然后运行此逻辑。

类似的东西:

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

答案 2 :(得分:0)

如果您想要更多可扩展的计数器缓存,请查看counter_culture。它支持基本的计数器缓存功能,但也允许您创建满足各种条件的记录计数器。例如,您可以使用以下代码轻松创建非活动用户计数:

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