How to skip callbacks on Mongoid Documents?
I ended up using Brian Armstrong's suggestion and simply calling
person.set(name:"Robert Pulson")
in my after save callback.
Yes you can!
Mongoid is built on ActiveModel and ActiveModel has a skip_callback function. You can use skip_callback
like this:
# 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)
I'm using this without a hitch in a big app. For more info, see this blog post by Jeff Kreeftmeijer:
http://jeffkreeftmeijer.com/2010/disabling-activemodel-callbacks/
It might be easier to use the Mongoid atomic operations (set, unset, etc):
https://docs.mongodb.com/mongoid/current/tutorials/mongoid-persistence/#atomic
These do not fire callbacks.
Edit: Mongoid 3 says they do not fire callbacks. I am seeing them fire callbacks in Mongoid 2 though. So YMMV