我正在寻找一种缓存每个州的数量的方法。我以前做过计数器缓存,但是有没有办法为每个状态创建多个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列。 有什么想法吗?
答案 0 :(得分: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
(此代码未经测试,但这是基本想法)