Várias colunas de cache balcão com AASM
-
21-08-2019 - |
Pergunta
Eu estou procurando uma maneira de armazenar em cache o número de cada estado. Eu tenho feito contra caching antes, mas há uma maneira para criar várias colunas counter_cache para cada estado e mantê-los atualizados ou devo procurar outro lugar para armazenamento em cache estes 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 ele seria apenas 3 colunas no banco de dados. Alguma idéia?
Solução
Você teria que fazer três colunas, uma para cada estado, mas a lógica de gravação manualmente para aumentar / diminuir esses contadores, usando a funcionalidade do objeto sujo. Rails não fornecer qualquer lógica automática em save
para fazer isso.
Assim, no modelo que está sendo contada:
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 não foi testado, mas esta é a idéia básica)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow