0

我读过关于关联的计数器缓存。

有没有一种方法可以在某些条件下轻松实现计数器缓存(通过一个可以完成繁重工作的 gem)?例如:

通常一个计数器缓存是

class User
  has_many :messages

class Message
  belongs_to :user, counter_cache: true

但是,假设我不想计算有多少消息,而是要计算来自 Joe 的所有消息中的字符总数

所以可以说我有一个方法count_chars_from(user)可以返回用户的字符数

我想在系统中发生很多事情时更新特定列(当 joe 向几个人发送消息时 - 所有这些用户都需要更新,当 joe 将消息编辑给一个人时,等等)

我猜这可以通过观察者来完成,但我看到自己很快就创建了丑陋的代码。

有没有办法得到类似上面的东西?

4

1 回答 1

0

目前,对此没有特殊的方法/助手。Rails 不支持条件计数器。

但是,您可以简单地定义自己的。

class Message
  belongs_to :user
  after_create :inc_counters
  after_destroy :dec_counters

  private
  def inc_counters
    if user && your_conditions
      user.increment(:conditional_counter)
    end
  end

  def dec_counters
    if user && your_conditions
      user.decrement(:conditional_counter)
    end
  end
end

我建议看一下counter_cache implementation。它看起来很复杂,但简单的实现在我的一个项目中效果很好。
还考虑使用update_column不触发User模型上的验证和回调。
并在您删除父模型时测试您dependent: :destroy的代码(如果它具有关联)。

于 2014-04-18T08:07:58.270 回答