0

我一直试图找到我的问题的答案,但到目前为止还没有运气。我有一个带有数组字段的模型,我希望在将某些东西推入数组时发生方法调用。

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被调用。

编辑:添加原因

所以这样做的原因是我想在每次添加项目时更新订单的priceand 。untaxed_price

4

3 回答 3

0

我认为猴子补丁<<是个坏主意。我有两个想法:

  • 使用某种观察者来监听并执行适当createOrderItem动作
  • 覆盖OrderItem.create方法(甚至更好地提供抽象):

```

class OrderItem
  def add(params)
    if create(params)
      calculate_something
    end
  end
end

```

于 2012-12-06T17:34:54.147 回答
0

是否需要一推就发生?或者它可以在您保存订单之前发生吗?如果您可以等到保存,您可以这样做:

before_validate :update_tax_info

def update_tax_info
  if items_changed?
    calculate_tax #whatever that may be
  end
end

将其投入验证将允许在不保存的情况下调用该回调。您可以致电@order.valid?更新税务信息。

于 2012-12-06T17:46:47.847 回答
0

本文档为您提供了实现所需行为的选择范围:http: //mongoid.org/en/mongoid/docs/callbacks.html

换句话说,您可以选择使用回调before_savebefore_update进行计算,或者您可以实现一个Observer类来为您执行此操作。

您还可以使用该changed方法查看 items 数组是否已更改以及是否需要更新派生字段。

这是一些示例代码:

class OrderObserver < Mongoid::Observer 
  def before_save(order)
    do_something
  end
end

请记住在 application.rb 中使用以下命令实例化您的观察者:

config.mongoid.observers = :order_observer
于 2012-12-06T17:55:15.400 回答