Rails:保存子级时更新父级记录

Cot*_*Joe 1 ruby-on-rails

我有以下结构:一个Order has_many销售(和一个Sale belongs_to)Order。

  • 每个销售都有一个quantity和 一个price列。
  • 每个订单都有一totalprice栏

totalprice由 属于父级的销售记录中的pricex quantityx组成。12Order

这是我的计算在订单模型中的样子:

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
Run Code Online (Sandbox Code Playgroud)

问题是: totalprice只有在更新或保存时才会更新,但在添加或删除Order新内容时不会更新。Sale

Ric*_*eck 6

你会想要使用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
Run Code Online (Sandbox Code Playgroud)

sale这将为您提供与/关联的各个对象,这些对象将通过以下方法order提供:inverse_of

当我们调用criminal.prisonwithout和:inverse_of关联时,它将访问数据库。对于,如果我们内存中已经有该监狱记录,那么将指向同一个监狱。:belongs_to:has_many:inverse_ofcriminal.prison