Несколько столбцов кэша счетчиков с помощью aasm
-
21-08-2019 - |
Вопрос
Я ищу способ кэшировать количество каждого состояния.Раньше я выполнял кэширование счетчиков, но есть ли способ создать несколько столбцов 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 столбца.Есть идеи?
Решение
Вам придется создать три столбца, по одному для каждого состояния, но написать логику вручную для увеличения/уменьшения этих счетчиков, используя функциональность грязных объектов.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
(Этот код не проверен, но это основная идея)
Не связан с StackOverflow