Rails:当Child得到保存时更新父记录

时间:2016-01-14 11:17:47

标签: ruby-on-rails

我有以下结构:Order has_many销售(以及Sale belongs_toOrder)。

  • 每次销售都有quantityprice列。
  • 每个订单都有一个totalprice

totalprice由属于父price的销售记录中的quantity x 12 x Order组成。

这是我的计算在Order模型中的内容:

class Order < ActiveRecord::Base
  has_many :sales, dependent: :destroy
  after_save :calc

  def price
   sales.to_a.sum { |item| item.price }
  end

  def totalpricex12
   totalpricex12 = price*12
  end

  def totaldiscount
   sales.to_a.sum { |item| item.discount }
  end

  def calc
   calc = (totalpricex12.to_f)-(totaldiscount.to_f)
   self.update_columns(totalprice: calc)
  end
end

问题是: totalprice仅在Order更新或保存时才会更新,但如果添加或删除新的Sale则不会更新。

2 个答案:

答案 0 :(得分:3)

您需要使用inverse_of

#app/models/sale.rb
class Sale < ActiveRecord::Base
   belongs_to :order, inverse_of: :sales
   validates  :order, presence: true

   after_create  :update_order
   after_destroy :update_order

   private

   def update_order
      order.calc
   end
end

#app/models/order.rb
class Order < ActiveRecord::Base
   has_many :sales, inverse_of: :order
end

这将为您提供与sale / order相关联的相应对象,这些对象将通过inverse_of method提供:

  

当我们在criminal.prison:inverse_of关联上调用:belongs_to而没有:has_many时,它会点击数据库。使用:inverse_of,如果我们已经记录在监狱中,那么criminal.prison将指向同一个监狱。

答案 1 :(得分:1)

您可以使用after_save回调,例如:

class Sale < ... 
  belongs_to :order

  after_save do
    order.calc
  end
end
像这样:

class Sale < ... 
  belongs_to :order
  after_save :update_order

  def update_order
    # call parent to self-update or something like this
  end
end