我有以下结构:Order
has_many
销售(以及Sale
belongs_to
和Order
)。
quantity
和price
列。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
则不会更新。
答案 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