我一直试图找到问题的答案,但到目前为止还没有运气。 我有一个带有数组字段的模型,我希望当某些东西被推入数组时会发生方法调用。
class Shop::Order
include Mongoid::Document
include Mongoid::Timestamps
embeds_many :items,class_name: 'Shop::OrderItem', inverse_of: :order
accepts_nested_attributes_for :items
field :price, type: Money, default: Money.new(0)
field :untaxed_price, type: Money, default: Money.new(0)
end
所以在做order.items << Shop::OrderItem.new(...)
时
我想要一个方法foo
来调用。
编辑:添加原因
所以原因是我想在每次添加商品时更新订单的price
和untaxed_price
。
答案 0 :(得分:0)
我认为猴子修补<<
是一个坏主意。我有两个想法:
create
OrderItem
并执行适当的操作OrderItem.create
方法(甚至更好地提供抽象):```
class OrderItem
def add(params)
if create(params)
calculate_something
end
end
end
```
答案 1 :(得分:0)
一旦推动它是否需要发生?或者可以在保存订单之前发生?如果你可以等到保存,你可以这样做:
before_validate :update_tax_info
def update_tax_info
if items_changed?
calculate_tax #whatever that may be
end
end
在验证中抛出它将允许在不保存的情况下调用回调。您可以致电@order.valid?
更新纳税信息。
答案 2 :(得分:0)
本文档为您提供了实现所需行为所需的一系列选择:http://mongoid.org/en/mongoid/docs/callbacks.html
要解释一下,您可以选择使用before_save
和before_update
之类的回调来进行计算,也可以实施Observer
类来为您执行此操作。
您还可以使用changed
方法查看items数组是否已更改以及是否需要更新派生字段。
以下是一些示例代码:
class OrderObserver < Mongoid::Observer
def before_save(order)
do_something
end
end
请记住使用以下方法在application.rb中实例化您的观察者:
config.mongoid.observers = :order_observer