私は次のようなモデルを持っています:
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 か所のきちんとしたリストに保持する必要があります。そうすれば、「ユーザーの残高が同期していないことがあり、問題を再現する方法がよくわからない」などのバグ レポートを受け取ったときに、何が起こっているのかを簡単に把握できます。