Sha256: 4dd0d3e80dc44aef778441fd93440efaec03d801abf3667b6c85e8595f631855

Contents?: true

Size: 1.36 KB

Versions: 1

Compression:

Stored size: 1.36 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
require 'active_support/concern'

module AfterCommitAction
  extend ActiveSupport::Concern

  included do
    after_commit :_after_commit_hook
  end

  def execute_after_commit(&block)
    if self.class.connection.open_transactions == 0
      return block.call
    else
      self.class.connection.add_transaction_record(self)
    end

    @_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

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
after_commit_action-1.1.0 lib/after_commit_action.rb