Rails模型与数组字段,修改推送方法

时间:2012-12-06 17:06:49

标签: ruby-on-rails ruby ruby-on-rails-3

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

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

编辑:添加原因

所以原因是我想在每次添加商品时更新订单的priceuntaxed_price

3 个答案:

答案 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_savebefore_update之类的回调来进行计算,也可以实施Observer类来为您执行此操作。

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

以下是一些示例代码:

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

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

config.mongoid.observers = :order_observer