0

我正在寻找一种方法来缓存每个状态的数量。我之前做过计数器缓存,但是有没有办法为每个状态创建多个 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 列。有任何想法吗?

4

1 回答 1

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

(此代码未经测试,但这是基本思想)

于 2009-06-30T13:34:07.873 回答