У меня есть дерево активных записей объектов, что-то вроде:Как я могу кэшировать вычисляемый столбец в рельсах?
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 каждый раз. Итак, мне нужен способ кэширования значения. Однако, если какая-либо часть изменена, ей необходимо аннулировать ее кеш и кеш ее родителя, а также дедушку и бабушку и т. Д.
Как черновик, я создал столбец для хранения кэшированных вычислений в таблице «детали» , но это немного пахнет. Похоже, что должен быть более чистый способ кэшировать рассчитанные значения, не набивая их вдоль «реальных» столбцов.
Я предполагаю, что это не будет обрабатывать случай, когда вы создаете sub_part с другого направления (* not * через has_many), например: Part.create (: parent_part => the_parent_part). Я бы, вероятно, добавил обратный вызов after_create для части, чтобы убедиться, что в этом случае срабатывает функция count_sub_parts ... – 2012-11-29 19:35:05