rails有一个很好的缓存memoization插件吗?

时间:2009-05-08 19:47:55

标签: ruby-on-rails ruby memcached memoization

我有一个模型:

class Account < ActiveRecord::Base

  has_many :payments
  has_many :purchases

  def balance
    payments.sum(:dollar_amount) - purchases.map{|p| p.dollar_amount}.sum
  end

end

我想记住balance方法并将其存储在memcached中。当然,问题在于,每次创建付款或购买时,缓存的值都需要过期。我可以在支付和购买的after_save回调中插入代码,以使他们帐户的缓存余额到期,但在我看来,如果我能说出这样的话会更容易理解/维护:

cached_memoize :balance, :depends_on => [:payments, :purchases]

是否有现有的宝石/插件可以做到这一点?在我开始写自己的作品之前,这是个好主意吗?我看到的缺点是,对于正在修改购买的dollar_amount方法的人来说,他们需要考虑一个缓存问题(如果他们无意中引入了对另一个模型的依赖,比如SubPurchase或其他东西,它可能会让它变得不那么明显)事情搞砸了。)但是因为这不是非常明显的,我认为有一个简洁的声明性语法是值得的 - 至少在它破坏的时候,很明显如何解决它。

思想?

编辑:为了回应semanticart的回答,我将更明确地解决我的问题,“只是把过期放在相关的回调”方法 - 问题是你最终会在整个代码库中过期 - 它始于after_save回调支付,但也许它是在一个单独的观察者购买,然后你有多态关联,继承树等。我提出的语法迫使开发人员将所有这些情况保存在一个整洁的列表中。这样,当你收到一个错误报告,例如“用户余额有时不同步而他们不太确定如何复制问题”时,弄清楚发生了什么事情要容易得多。

3 个答案:

答案 0 :(得分:1)

我会考虑另一种方法:在帐户上设置一个余额字段。在Purchase和SubPurchase模型上使用回调(after_save等)来更新父帐户的余额字段。只有当其他模型被修改后,您的余额才会发生变化,您永远不必担心它会过时。

答案 1 :(得分:0)

听起来像是你想要分叉cache_fu,并添加一个选项,它可以在依赖记录中神奇地撒上after_saves。我把你的依赖关系放在一个地方。

答案 2 :(得分:0)

不确定这是你在找什么,但它可能会有所帮助。

http://railscasts.com/episodes/137-memoization