【问题标题】:Ruby on Rails - before_save calculation on accepts_nested_attributes_forRuby on Rails - accept_nested_attributes_for 上的 before_save 计算
【发布时间】:2011-02-28 06:25:47
【问题描述】:

我有一个发票模型,它“有很多”发票项目。我有一个允许您创建/编辑发票的表单,该表单接受发票项目的嵌套属性。

在我的发票模型中,有一个“total_amount”字段是一个计算字段(发票项目中“金额”的总和)。

我想在创建或更新发票时计算此金额。我正在尝试在我的发票模型的 before_save 事件中执行此操作。下面的代码几乎可以工作,但是保存的总数总是落后一步。 IE。如果我有一张总额为 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

任何帮助将不胜感激。

【问题讨论】:

  • total_amount 必须保存吗?您可以通过将其定义为实例方法来在请求时重新计算它。
  • 出于性能原因我保存它

标签: ruby-on-rails nested-attributes calculated-field


【解决方案1】:

我解决了这个问题,我不得不用这个替换计算行:

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 也可以直接将.map替换为.sumself.total_amount = invoice_items.reject(&amp;:marked_for_destruction?).sum(&amp;:amount)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    相关资源
    最近更新 更多