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

状態ごとに1つずつ、合計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

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

于 2009-06-30T13:34:07.873 に答える