2009-06-30 4 views
0

각 상태의 수를 캐시하는 방법을 찾고 있습니다. 이전에 카운터 캐싱을 했었지만 각각의 상태에 대해 여러 counter_cache 열을 생성하고 업데이트를 유지하는 방법이 있거나이 값을 캐싱 할 다른 곳을 찾아야합니다.aasm을 사용하는 여러 카운터 캐시 열

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

각 상태마다 하나씩 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 

(이 코드는 테스트되지 않은, 그러나 이것은 기본적인 생각이다)