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が呼び出されることを望みます。

編集:理由を追加

その理由は、アイテムが追加されるたびに、注文のpriceとを更新したいからです。untaxed_price

4

3 に答える 3

0

モンキーパッチ<<は悪い考えだと思います。私には2つのアイデアがあります:

  • create耳を傾け、OrderItem適切な行動をとるある種のオブザーバーを使用する
  • メソッドを上書き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_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
于 2012-12-06T17:55:15.400 に答える