ruby on rails-在不关联的条件下计数器缓存



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

有没有一种方法可以在某种情况下轻松实现计数器缓存(通过一个将承担繁重任务的gem)?例如:

通常计数器缓存是

class User
  has_many :messages
class Message
  belongs_to :user, counter_cache: true

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

假设我有一个方法count_chars_from(user),它从用户返回字符数

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

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

有没有办法吃上面这样的东西?

目前,没有专门的方法/助手。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的实现。它看起来很复杂,但简单的实现在我的一个项目中效果很好
还要考虑使用update_column不触发User模型上的验证和回调
如果关联上有dependent: :destroy,则在删除父模型时测试代码。

相关内容

  • 没有找到相关文章

最新更新