我要寻找一种方法来缓存每个状态的数目。我已经做了柜台前的缓存,但有没有办法为每个州创建多个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列。 任何想法?

有帮助吗?

解决方案

您必须做的三列,一个用于每个状态,但手动编写逻辑递增/递减计数器的那些,使用脏对象的功能性。导轨不提供任何自动逻辑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

(该代码是未经测试,但是这是基本的想法)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top