次のようなアクティブなレコードオブジェクトのツリーがあります。
class Part < ActiveRecord::Base
has_many :sub_parts, :class_name => "Part"
def complicated_calculation
if sub_parts.size > 0
return self.sub_parts.inject(0){ |sum, current| sum + current.complicated_calculation }
else
sleep(1)
return rand(10000)
end
end
end
毎回complex_calculationを再計算するにはコストがかかりすぎます。したがって、値をキャッシュする方法が必要です。ただし、一部が変更された場合は、そのキャッシュとその親、祖父母などのキャッシュを無効にする必要があります。
大まかなドラフトとして、「パーツ」テーブルにキャッシュされた計算を保持する列を作成しましたが、これは少し腐ったにおいがします。計算された値を「実際の」列の横に詰め込むことなくキャッシュするためのよりクリーンな方法があるはずです。