質問

私は、各状態の数をキャッシュする方法を探しています。私は前にカウンターキャッシングを行っているが、各状態に対して複数の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列になるように

それはそうです。 任意のアイデア?

役に立ちましたか?

解決

あなたは3つの列、各状態のいずれかを実行する必要がありますが、汚れたオブジェクト機能を使用して、これらのカウンタをデクリメント/インクリメントし、手動でロジックを記述します。 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

(このコードはテストされていないが、これは基本的な考え方である)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top