2

私は次のようなモデルを持っています:

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 メソッドを memoize して memcached に保存したい。もちろん、問題は、支払いまたは購入が作成されるたびに、キャッシュされた値が期限切れになる必要があることです。支払いと購入の after_save コールバックにコードを挿入して、キャッシュされたアカウントの残高を期限切れにすることもできますが、次のように言えば理解しやすく維持しやすいと思います。

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

これを行う既存の宝石/プラグインはありますか? そして、私が出かけて自分自身を書く前に、それは良い考えですか? 私が見るマイナス面は、 Purchase のdollar_mount メソッドを変更している人にとって、キャッシュの問題を考慮する必要があることがわかりにくくなる可能性があることです (SubPurchase などの別のモデルへの依存関係を無意識のうちに導入した場合、それはしかし、これはとにかく明白ではないので、きちんとした宣言構文を持つことには価値があると思います - 少なくともそれが壊れたとき、それを修正する方法は明らかです

考え?

編集:セマンティックアートの答えに応えて、「関連するコールバックに有効期限を入れるだけ」というアプローチで私の問題についてより明確にします-問題は、コードベース全体に有効期限が切れることです-それは after_save コールバックで始まります私が提案している構文では、開発者はこれらすべてのケースを 1 か所のきちんとしたリストに保持する必要があります。そうすれば、「ユーザーの残高が同期していないことがあり、問題を再現する方法がよくわからない」などのバグ レポートを受け取ったときに、何が起こっているのかを簡単に把握できます。

4

3 に答える 3

1

別のアプローチを検討します。アカウントに残高フィールドを用意します。Purchase および SubPurchase モデルでコールバック (after_save など) を使用して、親アカウントの残高フィールドを更新します。残高は他のモデルが変更された場合にのみ変更され、古くなることを心配する必要はありません。

于 2009-05-08T19:58:49.947 に答える
0

cache_fuをフォークし、依存レコード全体にafter_savesを魔法のように振りかけるオプションを追加したいように私には聞こえます。私はあなたの依存関係を1か所に持っていることを掘り下げます。

于 2009-05-08T20:30:24.033 に答える
0

これがあなたが探しているものかどうかはわかりませんが、役立つかもしれません。

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

于 2009-05-09T19:23:03.203 に答える