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?

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top