Plusieurs colonnes de cache de compteur avec AASM
-
21-08-2019 - |
Question
Je cherche un moyen de mettre en cache le nombre de chaque état. Je l'ai fait contre la mise en cache avant, mais est-il possible de créer plusieurs colonnes de counter_cache pour chaque état et les tenir à jour ou devrais-je chercher ailleurs pour la mise en cache de ces valeurs.
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
Il semble que ce serait juste 3 colonnes dans la base de données. Toutes les idées?
La solution
Vous auriez à faire trois colonnes, une pour chaque état, mais manuellement écrire une logique pour incrémenter / décrémenter les compteurs, en utilisant la fonctionnalité de l'objet sale. Rails ne fournit aucune logique automatique à le faire save
.
Ainsi, dans le modèle étant compté:
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
(Ce code est non testé, mais cela est l'idée de base)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow