configure_dependency_for_has_many(reflection, extra_conditions = nil)
private
Creates before_destroy callback methods that nullify, delete or destroy has_many
associated objects, according to the defined :dependent rule. If the
association is marked as :dependent => :restrict, create a callback that
prevents deleting entirely.
See HasManyAssociation#delete_records. Dependent associations delete
children, otherwise foreign key is set to NULL. See
HasManyAssociation#delete_records. Dependent associations delete children
if the option is set to :destroy or :delete_all, set the foreign key to
NULL if the option is set to :nullify, and do not touch the child records
if the option is set to :restrict.
The extra_conditions parameter, which is not used within the main
Active Record codebase, is meant to
allow plugins to define extra finder conditions.
Show source
def configure_dependency_for_has_many(reflection, extra_conditions = nil)
if reflection.options.include?(:dependent)
case reflection.options[:dependent]
when :destroy
method_name = "has_many_dependent_destroy_for_#{reflection.name}".to_sym
define_method(method_name) do
send(reflection.name).each do |o|
counter_method = ('belongs_to_counter_cache_before_destroy_for_' + self.class.name.downcase).to_sym
if(o.respond_to? counter_method) then
class << o
self
end.send(:define_method, counter_method, Proc.new {})
end
o.destroy
end
end
before_destroy method_name
when :delete_all
before_destroy do |record|
self.class.send(:delete_all_has_many_dependencies,
record,
reflection.name,
reflection.klass,
reflection.dependent_conditions(record, self.class, extra_conditions))
end
when :nullify
before_destroy do |record|
self.class.send(:nullify_has_many_dependencies,
record,
reflection.name,
reflection.klass,
reflection.primary_key_name,
reflection.dependent_conditions(record, self.class, extra_conditions))
end
when :restrict
method_name = "has_many_dependent_restrict_for_#{reflection.name}".to_sym
define_method(method_name) do
unless send(reflection.name).empty?
raise DeleteRestrictionError.new(reflection)
end
end
before_destroy method_name
else
raise ArgumentError, "The :dependent option expects either :destroy, :delete_all, :nullify or :restrict (#{reflection.options[:dependent].inspect})"
end
end
end