public
Last active

  • Download Gist
activerecord-3-skip_callbacks.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
require 'active_support/basic_object'
 
ActiveRecord::Base.class_eval do
class WithoutCallbacks < ActiveSupport::BasicObject
def initialize(target, types)
@target = target
@types = types
end
def respond_to?(method, include_private = false)
@target.respond_to?(method, include_private)
end
def method_missing(method, *args, &block)
@target.skip_callbacks(*@types) do
@target.send(method, *args, &block)
end
end
end
class << self
def without_callbacks(*types)
WithoutCallbacks.new(self, types)
end
def skip_callbacks(*types)
types = [:save, :create, :update, :destroy, :touch] if types.empty?
deactivate_callbacks(types)
yield.tap do
activate_callbacks(types)
end
end
def deactivate_callbacks(types)
types.each do |type|
name = :"_run_#{type}_callbacks"
alias_method(:"_deactivated_#{name}", name)
define_method(name) { |&block| block.call }
end
end
def activate_callbacks(types)
types.each do |type|
name = :"_run_#{type}_callbacks"
alias_method(name, :"_deactivated_#{name}")
undef_method(:"_deactivated_#{name}")
end
end
end
end

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.