0

たとえば、あなたが持っているとしましょう

class Account << ActiveRecord

   has_many :receipts

   after_touch :calculate_sum

   def calculate_sum
      self[:total_sum] = receipts.sum(:value)
   end
end

class Receipt << ActiveRecord
   belongs_to :account, :touch => true
end

各アカウントは、関連付けられているすべての領収書の合計を保持する必要があります。アカウントの領収書の値を更新すると、after_touch コールバックが発生し、値が更新されます。そこにはすべてハンキードーリーがあります。

しかし、領収書の親を変更すると..

receipt = account_a.receipts.first
receipt.account = account_b

また

account_b.receipts << receipt

これらの場合、コールバックは古いアカウントでも新しいアカウントでもトリガーされません。

どうすればそうなりますか?

4

1 に答える 1

0

レールキャストにはカウンターキャッシュ列を使用する必要があります

1) 移行

def self.up
  add_column :accounts, :receipts_count, :integer, :default => 0

  Account.reset_column_information
  Account.all.each do |p|
    Account.update_counters p.id, :receipts_count => p.receipts.length
  end
end

2)

class Receipt << ActiveRecord
   belongs_to :account, :counter_cache => true
end

アップデート:

これは計算フィールドであるため、データベースに保存せず、毎回カウントします。コールバックを使用する必要はありません。この問題を解決するには、メソッドを作成します。

   def calculate_sum
     receipts.sum(:value)
   end
于 2013-08-08T15:48:56.097 に答える