21

私の質問はこれに似ていますActiveRecordコールバックをスキップする方法は?しかし、ARの代わりにMongoidを使用していますが、現在のバージョンのMongoidにはまだ実装されていないようです。そのため、それを実装するための洗練されたソリューションとは何かを知りたいと思います。(必要ならば)。

4

5 に答える 5

31

はい、できます!

Mongoid は ActiveModel 上に構築されており、ActiveModel にはskip_callback 関数があります。skip_callback次のように使用できます。

# skip the callback
MyModelClass.skip_callback(:save, :before, :ensure_foo_is_not_bar)

# rescue any errors to ensure callback is restored afterwords
begin
  my_model_instance.update_attributes :foo => 'bar'
rescue
  puts "Error from 'my_model_instance.update_attributes': #{$!}"
end

# restore the callback for future calls
MyModelClass.set_callback(:save, :before, :ensure_foo_is_not_bar)

大きなアプリで問題なく使用しています。詳細については、Jeff Kreeftmeijer による次のブログ投稿を参照してください。

http://jeffkreeftmeijer.com/2010/disabling-activemodel-callbacks/

于 2010-10-12T20:58:22.663 に答える
22

Mongoid アトミック操作 (設定、設定解除など) を使用する方が簡単な場合があります。

https://docs.mongodb.com/mongoid/current/tutorials/mongoid-persistence/#atomic

これらはコールバックを起動しません。

編集: Mongoid 3 は、コールバックを起動しないと言います。ただし、Mongoid 2 でコールバックが発生するのを見ています。そうYMMV

于 2012-09-13T04:58:43.487 に答える
15

Brian Armstrongの提案を使用して、単に呼び出すことになりました

person.set(name:"Robert Pulson")

保存後のコールバックで。

于 2015-06-19T18:34:57.983 に答える
3

多くの場合、これは、大量のアイテムに対してすべてのコールバックを起動せずに更新を実行する場合に発生します。これは、ドライバーに降りることによって行うことができます。

'x'フィールドの'foo'を'bar'に置き換えます。

User.all.each do |u|
  User.collection.where({ _id: u.id }).update({ 
    "$set" => { :x => u.x.gsub('foo', 'bar') 
  })
end
于 2013-01-07T18:37:54.617 に答える
1

コードを検索します。そして、Mongoidではコールバックを回避する方法はありません。バージョン1.9と2.0の両方で。

それについてパッチまたは機能リクエストを行う必要があります。

于 2010-06-15T16:26:18.740 に答える