How to skip ActiveRecord callbacks? [duplicate]

Possible Duplicate:
How can I avoid running ActiveRecord callbacks?

I have model like this

class Vote < ActiveRecord::Base  
    after_save :add_points_to_user

    .....
end

Is it possible to somehow force model to skip calling add_points_to_user when saved? Possibly something like ActiveRecord#delete vs ActiveRecord#destroy?


For Rails 3, ActiveSupport::Callbacks gives you the necessary control. I was just facing the same challenge in a data integration scenario where normally-desirable-callbacks needed to be brushed aside. You can reset_callbacks en-masse, or use skip_callback to disable judiciously, like this:

Vote.skip_callback(:save, :after, :add_points_to_user)

..after which you can operate on Vote instances with :add_points_to_user inhibited


The following applies to rails 2, rails 3 and rails 4:

http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#skipping-callbacks

It provides a list of methods that skip callbacks, explaining why it is dangerous to use them without careful consideration. Reprinted here under the provisions of the Creative Commons Attribution-Share Alike 3.0 License.

12 Skipping Callbacks

Just as with validations, it is also possible to skip callbacks. These methods should be used with caution, however, because important business rules and application logic may be kept in callbacks. Bypassing them without understanding the potential implications may lead to invalid data.

  • decrement
  • decrement_counter
  • delete
  • delete_all
  • find_by_sql
  • increment
  • increment_counter
  • toggle
  • touch
  • update_column
  • update_all
  • update_counters

For Rails 2, but not Rails 3 you can use these:

object.send(:create_without_callbacks)
object.send(:update_without_callbacks)

This will skip your validations:

vote.save(:validate => false)

more info here

To skipping your callbacks and validations, you can use, update_column v(3.1), or update_all

vote = Vote.first
vote.update_column(:subject, 'CallBacks')

Aparentlly this only works with ActiveRecord 3.1

Or:

Vote.where('id = ?', YourID).update_all(:subject => 'CallBacks')

In the end you have also i finally option and this will skip everthing:

execute "UPDATE votes SET subject = 'CallBacks' WHERE id = YourID"

OK the last one it's not so pretty.