2011-02-28 63 views
7

我有一個發票模型,即「有許多」發票項目。我有一個表單,允許您創建/編輯發票,並且此表單接受發票項目的嵌套屬性。Ruby on Rails - before_save計算在acceptable_nested_attributes_for

在我的發票模型中,有一個「total_amount」字段,它是一個計算字段(發票項目中「金額」的總和)。

我想在創建或更新發票時計算此金額。我正在嘗試在我的發票模型的before_save事件中執行此操作。下面的代碼幾乎可以工作,但是保存的總量總是落後一步。即如果我有總額爲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 

任何幫助將不勝感激。

+0

是否必須保存total_amount?只要將其定義爲實例方法,您就可以重新計算它。 – dunedain289 2011-02-28 06:49:45

+0

由於性能原因我正在保存它 – 2011-03-18 01:18:42

回答

5

我解決了這個問題,我不得不更換這一個計算行:

self.total_amount = invoice_items.map(&:amount).sum 
4

試試這個:

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

+0

您也可以直接用'.sum'替換'.map': 'self.total_amount = invoice_items.reject(&:marked_for_destruction?)。sum(&:amount)' – 2017-03-13 08:52:58

0

我知道這是有點晚了,但也許有人能效益。檢查日誌以查看數據庫操作的順序。我有一個類似的問題,在導致類似結果的父模型的保存操作之後插入嵌套模型。