我有活動記錄對象的樹,像這樣:如何在軌中緩存計算列?
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