Несколько столбцов счетчика кэша с AASM
Я ищу способ кешировать номер каждого состояния. Ранее я делал кеширование счетчиков, но есть ли способ создать несколько столбцов counter_cache для каждого состояния и поддерживать их в актуальном состоянии, или я должен искать в другом месте кэширование этих значений.
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
Кажется, что это будет всего 3 столбца в базе данных. Есть идеи?
1 ответ
Решение
Вам нужно будет сделать три столбца, по одному для каждого состояния, но написать логику вручную, чтобы увеличить / уменьшить эти счетчики, используя грязную функциональность объекта. Rails не предоставляет никакой автоматической логики в save
сделать это.
Итак, в подсчитываемой модели:
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
(Этот код не проверен, но это основная идея)