8

「多くの」請求書アイテムがある請求書モデルがあります。請求書を作成/編集できるフォームがあります。このフォームは、請求書アイテムのネストされた属性を受け入れます。

私の請求書モデルには、計算フィールド(請求書アイテムの「金額」の合計)である「total_amount」フィールドがあります。

請求書の作成時または更新時にこの金額を計算したいのですが。請求書モデルのbefore_saveイベントでこれを実行しようとしています。以下のコードはほぼ機能しますが、保存される合計は常に1ステップ遅れています。つまり、合計$ 20の請求書があり、この請求書を編集して請求書アイテムを合計$ 15に変更し、請求書を保存した場合、合計は変更されません。同じ請求書を開いてからもう一度保存すると、合計が正しく更新されます。

合計を計算する以下の行は、データベースにすでに保存されているラインアイテムにアクセスしており、変更されたばかりで保存されようとしているラインアイテムにはアクセスしていないと想定しています。しかし、それらにアクセスする方法がわかりません。

class Invoice < ActiveRecord::Base
  has_many :invoice_items, :dependent => :destroy

  accepts_nested_attributes_for :invoice_items, :allow_destroy => true 

  before_save :record_total_amount

  private
    def record_total_amount
      self.total_amount = self.invoice_items.sum('amount')
    end
end

どんな助けでも大歓迎です。

4

2 に答える 2

5

この問題を解決しました。計算ラインを次のラインに置き換える必要がありました。

self.total_amount = invoice_items.map(&:amount).sum
于 2011-02-28T06:48:06.993 に答える
4

これを試して:

self.total_amount = invoice_items.reject(&:marked_for_destruction?).map(&:amount).sum

于 2013-03-17T15:28:38.593 に答える