How to skip callbacks on Mongoid Documents?

jpemberthy picture jpemberthy · Jun 15, 2010 · Viewed 11.3k times · Source

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).

Answer

bowsersenior picture bowsersenior · Oct 12, 2010

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/