我有一棵事件记录对象树,类似于:
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,代价太大。所以,我需要一种方法来缓存值。但是,如果任何部分发生变化,则需要使它的缓存以及它的父、祖父等的缓存失效。
作为草稿,我创建了一个列来保存“部分”表中的缓存计算,但这闻起来有点腐烂。似乎应该有一种更简洁的方法来缓存计算值,而不会将它们与“真实”列一起填充。
最佳答案
我建议使用关联回调。
class Part < ActiveRecord::Base
has_many :sub_parts,
:class_name => "Part",
:after_add => :count_sub_parts,
:after_remove => :count_sub_parts
private
def count_sub_parts
update_attribute(:sub_part_count, calculate_sub_part_count)
end
def calculate_sub_part_count
# perform the actual calculation here
end
end
很好很简单 =)
关于ruby-on-rails - 如何在 Rails 中缓存计算列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/181090/