【问题标题】:Is there a good cached memoization plugin for rails?有没有一个很好的用于 Rails 的缓存记忆插件?
【发布时间】:2010-10-24 21:33:42
【问题描述】:

我有一个类似的模型:

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]

是否有现有的 gem/插件可以做到这一点?在我开始自己写之前,这是个好主意吗?我看到的缺点是,对于正在修改 Purchase 的 Dollar_amount 方法的人来说,他们需要考虑缓存问题可能不太明显(如果他们无意中引入了对另一个模型的依赖,比如 SubPurchase 或其他东西,它会搞砸的。)但由于这不是很明显,我认为有一个简洁的声明性语法是值得的——至少当它崩溃时,很清楚如何修复它。

想法?

编辑:为了响应语义艺术的回答,我将更明确地说明“只需将过期时间放在相关回调中”方法的问题 - 问题是你最终会在整个代码库中过期 - 它以after_save 付款回调,但也许它在一个单独的购买观察者中,然后你有多态关联、继承树等。我提出的语法迫使开发人员将所有这些案例保存在一个整齐的列表中。这样,当您收到诸如“用户余额有时不同步并且他们不太确定如何复制问题”之类的错误报告时,更容易弄清楚发生了什么。

【问题讨论】:

    标签: ruby-on-rails ruby memcached memoization


    【解决方案1】:

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

    【讨论】:

    • 这与在 memcached 中执行此操作几乎相同(除了更昂贵),因此我认为我对集中声明性语法优势的推理仍然成立。我并没有在原始帖子中真正说明它,但我对这种方法的问题是您最终不知道所有这些更新/过期的来源 - 我现在将进行编辑以更清楚。
    • 好吧,对不起,我猜你得到的是,如果我想更新余额而不从头开始重新计算,我建议的模式根本行不通。在这种情况下,这不是问题,而是重点。
    • 这甚至不是为了避免从头开始重新计算它。如果您实现回调,那么您将永远不必担心该数字过时,因为购买和子购买将(出于所有意图和目的)自行清除缓存的余额。在这种情况下,缓存的值恰好是 Account 上的一个字段。这样做的一个很好的副作用是您可以根据余额进行查询。假设您想在后端按余额从高到低排序:没有缓存列,您必须确保首先为每个帐户计算它。
    • 我不是想成为一个混蛋,我很感激你花时间帮助我,但你是否仔细阅读了这个问题?
    【解决方案2】:

    在我看来,您想分叉 cache_fu,并添加一个选项,将 after_saves 神奇地洒在相关记录中。我将您的依赖项放在一个地方。

    【讨论】:

      【解决方案3】:

      不确定这是您正在寻找的,但它可能会有所帮助。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        • 2021-11-24
        • 2016-05-19
        • 1970-01-01
        • 2016-08-14
        • 2011-09-26
        • 1970-01-01
        相关资源
        最近更新 更多