Несколько столбцов счетчика кэша с AASM - PullRequest
0 голосов
/ 30 июня 2009

Я ищу способ кешировать номер каждого состояния. Раньше я делал кеширование счетчиков, но есть ли способ создать несколько столбцов 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 Ответ

1 голос
/ 30 июня 2009

Вы должны будете сделать три столбца, по одному для каждого состояния, но написать логику вручную, чтобы увеличить / уменьшить эти счетчики, используя функциональность грязных объектов. 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

(Этот код не проверен, но это основная идея)

...