【问题标题】:Ruby on Rails Increment Counter in Model模型中的 Ruby on Rails 增量计数器
【发布时间】:2011-02-16 16:25:24
【问题描述】:

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

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

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

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

这是正确(最佳实践)的地方吗?我让它在控制器中工作,但想清理它。

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

【问题讨论】:

  • 你能添加你用来创建 Count 对象的代码吗?您可能希望包含您的目标或业务案例,否则请为尝试重构您正在做的事情的大量答案做好准备。
  • 我明白了,我想概括模型并使情况变得简单。 User has_many Counts 其中每个 User 条目都有一个在创建时跟踪计数的列 (user.count)。

标签: ruby-on-rails model callback


【解决方案1】:

如果User 有很多Counts 并且Count 属于User(好像是这样),那么您可能想要使用counter cache。它完全符合您的要求,并且内置在 ActiveRecord 中。

【讨论】:

    【解决方案2】:

    我认为一个更好的地方是使用一个observer 来监听用户对象的 on_create,然后运行这个逻辑。

    类似:

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

    【讨论】:

    • 有趣的解决方案,我将同时尝试计数器缓存和观察者。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-20
      • 2020-04-23
      • 1970-01-01
      • 2011-01-28
      • 2011-01-26
      • 2010-09-08
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      相关资源
      最近更新 更多