我有一个活动记录对象树,例如:
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 成本太高。所以,我需要一种缓存值的方法。但是,如果任何部分发生更改,则需要使其缓存以及其父级和祖父级的缓存等无效。
作为一个粗略的草稿,我创建了一个列来将缓存的计算保存在“parts”表中,但这闻起来有点烂。似乎应该有一种更简洁的方法来缓存计算值,而不是将它们塞在“真实”列旁边。