1

埋め込みドキュメントフィールドが変更された場合にのみコールバックを実行する方法はありますか?

現在、以下は、変更された場合にのみ、通常のフィールドでコールバックを実行します。

class user
  field :email, type: String
  embeds_many :connections, cascade_callbacks: true
  before_save :run_callback, :if => :email_changed?
  before_save :run_connection_callback, :if => :connections_changed?  # DOES NOT WORK
end
4

2 に答える 2

1

2015年にこの答えを見た人のために

Mongoid 4.xではmodel.changed model.changesが存在し、ActiveRecordの対応するものと同じように動作します。

于 2015-09-10T14:57:27.580 に答える
0

Mongoidはメソッドを定義しませんが、組み込み接続がいつ変更されるかを追跡するためにconnections_changed?仮想フィールドを使用して自分でメソッドを定義できます。Userあれは:

class User

  # define reader/writer methods for @connections_changed
  attr_accessor :connections_changed

  def connections_changed?
    self.connections_changed
  end

  # the connections are no longer considered changed after the persistence action
  after_save { self.connections_changed = false }

  before_save :run_connection_callback, :if => :connections_changed?

end

class Connection
  embedded_in :user

  before_save :tell_user_about_change, :if => :changed?

  def tell_user_about_change
    user.connections_changed = true
  end
end

この方法の欠点の1つはuser.connections_changed、ドキュメントが保存されたときにのみ設定されることです。Connection before_saveコールバックは、コールバックが最初に呼び出され、次にコールバックが呼び出されるようにカスケードされUser before saveます。これにより、上記のコードがこのユースケースで機能するようになります。ただし、を呼び出す前に接続が変更されたかどうかを知る必要がある場合saveは、別のメソッドを見つける必要があります。

于 2012-10-16T04:37:54.653 に答える