我有活动记录对象的树,像这样:如何在轨中缓存计算列?
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
实在是太昂贵,每次重新计算complicated_calculation。所以,我需要一种缓存价值的方法。但是,如果任何部分发生更改,则需要使其缓存及其父项和祖父项等的缓存无效。作为粗略草稿,我创建了一个列以在“部分”表中保存缓存计算,但这味道有点烂。似乎应该有一个更清晰的方式来缓存计算值,而不是将它们填充到“真实”列的旁边。
我猜这不会处理从另一个方向创建子部件的情况(* not * through has_many),如下所示:Part.create(:parent_part => the_parent_part)。我可能会在Part上添加一个after_create回调,以确保count_sub_parts在这种情况下也被触发... – 2012-11-29 19:35:05