0
@@ -1428,15 +1428,23 @@ module ActiveRecord
0
+ # Creates before_destroy callback methods that nullify, delete or destroy
0
+ # has_many associated objects, according to the defined :dependent rule.
0
# See HasManyAssociation#delete_records. Dependent associations
0
# delete children, otherwise foreign key is set to NULL.
0
- def configure_dependency_for_has_many(reflection)
0
+ # The +extra_conditions+ parameter, which is not used within the main
0
+ # Active Record codebase, is meant to allow plugins to define extra
0
+ def configure_dependency_for_has_many(reflection, extra_conditions = nil)
0
if reflection.options.include?(:dependent)
0
# Add polymorphic type if the :as option is present
0
dependent_conditions = []
0
dependent_conditions << "#{reflection.primary_key_name} = \#{record.quoted_id}"
0
dependent_conditions << "#{reflection.options[:as]}_type = '#{base_class.name}'" if reflection.options[:as]
0
dependent_conditions << sanitize_sql(reflection.options[:conditions]) if reflection.options[:conditions]
0
+ dependent_conditions << extra_conditions if extra_conditions
0
dependent_conditions = dependent_conditions.collect {|where| "(#{where})" }.join(" AND ")
0
case reflection.options[:dependent]
0
@@ -1447,9 +1455,24 @@ module ActiveRecord
0
before_destroy method_name
0
- module_eval "before_destroy { |record| #{reflection.class_name}.delete_all(%(#{dependent_conditions})) }"
0
+ before_destroy do |record|
0
+ delete_all_has_many_dependencies(record,
0
+ #{reflection.class_name},
0
+ "#{dependent_conditions}")
0
- module_eval "before_destroy { |record| #{reflection.class_name}.update_all(%(#{reflection.primary_key_name} = NULL), %(#{dependent_conditions})) }"
0
+ before_destroy do |record|
0
+ nullify_has_many_dependencies(record,
0
+ #{reflection.class_name},
0
+ "#{reflection.primary_key_name}",
0
+ "#{dependent_conditions}")
0
raise ArgumentError, "The :dependent option expects either :destroy, :delete_all, or :nullify (#{reflection.options[:dependent].inspect})"
0
@@ -1509,6 +1532,14 @@ module ActiveRecord
0
+ def delete_all_has_many_dependencies(record, reflection_name, association_class, dependent_conditions)
0
+ association_class.delete_all(dependent_conditions)
0
+ def nullify_has_many_dependencies(record, reflection_name, association_class, primary_key_name, dependent_conditions)
0
+ association_class.update_all("#{primary_key_name} = NULL", dependent_conditions)
0
mattr_accessor :valid_keys_for_has_many_association
0
@@valid_keys_for_has_many_association = [
0
:class_name, :table_name, :foreign_key, :primary_key,