Sha256: 3a0959955e48d9c5ec4cf7a150cbd7e47127d0152baea57d631bd61ae2e1fb17

Contents?: true

Size: 1.3 KB

Versions: 2

Compression:

Stored size: 1.3 KB

Contents

# use this module to defer actions to the after-commit hook. this is useful if you want
# to trigger actions in after_create, after_destroy and after_update callbacks but want
# to execute them outside of the transaction (for example, to avoid deadlocks).
# 
# Usage:
# after_create :my_hook
# def my_hook
#   execute_after_commit { puts "This is called after committing the transaction. "}
# end

module AfterCommitAction
  
  module ActiveRecord

    def self.included(base)
      base.after_commit :_after_commit_hook
    end

    def execute_after_commit(&block)
      @_execute_after_commit ||= []
      @_execute_after_commit<< block
    end
    
    def _after_commit_hook
      begin
        until @_execute_after_commit.blank?
          @_execute_after_commit.shift.call
        end
      rescue => e
        if defined?(Exceptional)
          # Rails quietly swallows exceptions in after-commit actions; to avoid missing these
          # exceptions, we pass them to Exceptional explicitly
          Exceptional.context(:after_commit_entity => self.inspect)
          Exceptional.handle(e, "execute_after_commit")
        else
          Rails.logger.error "Error in execute_after_commit block: #{e.inspect}"
        end
        raise e
      end
    end
  
  end

  ::ActiveRecord::Base.send :include, ActiveRecord
  
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
after_commit_action-0.1.3 lib/after_commit_action.rb
after_commit_action-0.1.2 lib/after_commit_action.rb