module AssociationCallbacks::ActiveRecord

Constants

CALLBACKS

Public Instance Methods

define_callback_with_association(callback, methods, options = {}, &block) click to toggle source
# File lib/association_callbacks/active_record.rb, line 47
def define_callback_with_association(callback, methods, options = {}, &block)
  relation_name = options.delete(:source).try(:to_sym)
  relation = reflect_on_association(relation_name) || raise(ArgumentError.new("No such association: #{name}.#{relation_name}"))
  inverse_relation_name = relation.inverse_of.try(:name).presence || raise(ArgumentError.new("You must specify :inverse_of on #{name}.#{relation_name} to use association callbacks"))
  relation.klass.send(callback, options) do |record|
    invoke_callback_with_association(record, record.send(inverse_relation_name), methods, &block)
  end
end

Private Instance Methods

invoke_callback_block_with_association(record, inverse_record) { |inverse_record, record| ... } click to toggle source
# File lib/association_callbacks/active_record.rb, line 60
def invoke_callback_block_with_association(record, inverse_record, &block)
  yield(inverse_record, record) if block_given?
end
invoke_callback_methods_with_association(record, inverse_record, methods) click to toggle source
# File lib/association_callbacks/active_record.rb, line 64
def invoke_callback_methods_with_association(record, inverse_record, methods)
  methods.each do |method|
    if inverse_record.method(method).arity == 1
      inverse_record.send(method, record)
    else
      inverse_record.send(method)
    end
  end
end
invoke_callback_with_association(record, assocation, methods, &block) click to toggle source
# File lib/association_callbacks/active_record.rb, line 74
def invoke_callback_with_association(record, assocation, methods, &block)
  return if assocation.nil?
  if assocation.respond_to?(:find_each)
    assocation.find_each do |inverse_record|
      invoke_callback_methods_with_association(record, inverse_record, methods)
      invoke_callback_block_with_association(record, inverse_record, &block)
    end
  elsif assocation.is_a?(::ActiveRecord::Base)
    invoke_callback_methods_with_association(record, assocation, methods)
    invoke_callback_block_with_association(record, assocation, &block)
  else
    raise "Assocation can't be used by callbacks: #{association.inspect}"
  end
end