我读过关于关联的计数器缓存。
有没有一种方法可以在某种情况下轻松实现计数器缓存(通过一个将承担繁重任务的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
,则在删除父模型时测试代码。