Varias columnas de caché contador con AASM
-
21-08-2019 - |
Pregunta
Estoy buscando una manera de almacenar en caché el número de cada estado. He hecho el almacenamiento en caché mostrador antes, pero ¿hay una manera de crear varias columnas counter_cache para cada estado y mantenerlos actualizados o debería buscar otro sitio para el almacenamiento en caché estos valores.
aasm_column :state
aasm_initial_state :unopened
aasm_state :unopened
aasm_state :contacted
aasm_state :closed
aasm_event :contact do
transitions :to => :contacted, :from => [:unopened]
end
aasm_event :close do
transitions :to => :closed, :from => [:contacted]
end
Parece que no sería más que 3 columnas en la base de datos. ¿Alguna idea?
Solución
Usted tendría que hacer tres columnas, una para cada estado, pero la lógica escribir manualmente para aumentar / disminuir esos contadores, utilizando la funcionalidad objeto sucio. Raíles no proporciona ninguna lógica automática en save
para hacer esto.
Así, en el modelo que se está contado:
after_create :increment_counter
after_save :update_counters
after_destroy :decrement_counter
def increment_counter
self.parent.increment("#{self.state}_counter")
end
def decrement_counter
self.parent.decrement("#{self.state}_counter")
end
def update_counters
return unless self.state_changed?
self.parent.decrement("#{self.state_was}_counter")
self.parent.increment("#{self.state}_counter")
end
(Este código no se ha probado, pero esta es la idea básica)