que tienen un árbol de objetos de registro activos, algo así como:¿Cómo puedo almacenar en caché una columna calculada en rieles?
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
Es demasiado costoso para volver a calcular la complicated_calculation cada vez. Entonces, necesito una forma de almacenar el valor en caché. Sin embargo, si se cambia alguna parte, debe invalidar su caché y la memoria caché de su principal y abuelos, etc.
Como borrador preliminar, creé una columna para mantener el cálculo en caché en la tabla "partes" , pero esto huele un poco podrido. Parece que debe haber una manera más limpia de almacenar en caché los valores calculados sin rellenarlos junto a las columnas "reales".
Supongo que esto no manejaría el caso en el que creas una sub_parte desde la otra dirección (* no * a través de has_many), como esto: Part.create (: parent_part => the_parent_part). Probablemente agregue una devolución de llamada after_create en la Parte solo para asegurarme de que count_sub_parts se active en ese caso también ... –
Acabo de hacer una pequeña prueba en Rails 4 y verificada, estos hooks after_add y after_remove no se activan cuando se crea el registro secundario (sub_part) directamente –