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

您应该为它使用计数器缓存列rails cast

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 回答