如何避免使用Rails不断重新计算摘要数据?

Fin*_*nch 1 caching ruby-on-rails fragment-caching

我有一个用户个人资料页面,其侧边栏的用户统计信息与Stack Overflow个人资料页面不同(例如,总访问次数,徽章数量).

麻烦的是,目前我正在访问数据库并使用每个请求计算这些统计数据.我可以实现片段缓存来减少这个,但有没有更好的方法来处理这类事情?

将聚合的摘要数据存储在数据库中似乎可能会导致问题(即不一致).

ssc*_*rus 6

您可以将此信息存储在数据库中,而不是使用以下方法重新计算:

  1. 反缓存
  2. 自定义回调

反缓存

例如,如果测量徽章的数量,您可以在User被调用中创建数据库字段badges_count,然后在徽章模型中创建belongs_to :user, :counter_cache => true.现在,只要徽章数量发生变化,您就可以访问计数而无需进行任何新的计算@user.badges_count.

基本实现:http://asciicasts.com/episodes/23-counter-cache-column

自定义回调

假设您有一个字段来衡量比简单计数更复杂的行为.在这种情况下,只需要实现回调,每当发生某一动作使用更新场before_save,after_save,before_create,等.

对不一致的担忧

如果您做错了,将数据存储在数据库中只会不一致.任何统计信息都可以通过有限数量的路径进行更新,并且应该确保在更新您使用的任何字段时都涵盖所有路径.Rails使用counter_caching为你做,如果你使用自定义回调或者你有一些不寻常的情况,你必须自己做.