My question is similar to this one How to skip ActiveRecord callbacks? but instead of AR I'm using Mongoid, It seems like that isn't implemented yet in the current version of Mongoid, so I'd like to know what should be an elegant solution to implement it. (if necessary).
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
I ended up using Brian Armstrong's suggestion and simply calling
person.set(name:"Robert Pulson")
in my after save callback.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With