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