私の質問はこれに似ていますActiveRecordコールバックをスキップする方法は?しかし、ARの代わりにMongoidを使用していますが、現在のバージョンのMongoidにはまだ実装されていないようです。そのため、それを実装するための洗練されたソリューションとは何かを知りたいと思います。(必要ならば)。
5 に答える
はい、できます!
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/
Mongoid アトミック操作 (設定、設定解除など) を使用する方が簡単な場合があります。
https://docs.mongodb.com/mongoid/current/tutorials/mongoid-persistence/#atomic
これらはコールバックを起動しません。
編集: Mongoid 3 は、コールバックを起動しないと言います。ただし、Mongoid 2 でコールバックが発生するのを見ています。そうYMMV
Brian Armstrongの提案を使用して、単に呼び出すことになりました
person.set(name:"Robert Pulson")
保存後のコールバックで。
多くの場合、これは、大量のアイテムに対してすべてのコールバックを起動せずに更新を実行する場合に発生します。これは、ドライバーに降りることによって行うことができます。
'x'フィールドの'foo'を'bar'に置き換えます。
User.all.each do |u|
User.collection.where({ _id: u.id }).update({
"$set" => { :x => u.x.gsub('foo', 'bar')
})
end
コードを検索します。そして、Mongoidではコールバックを回避する方法はありません。バージョン1.9と2.0の両方で。
それについてパッチまたは機能リクエストを行う必要があります。