diff options
Diffstat (limited to 'activerecord/lib/active_record')
-rwxr-xr-x | activerecord/lib/active_record/associations.rb | 4 | ||||
-rw-r--r-- | activerecord/lib/active_record/associations/has_many_association.rb | 8 |
2 files changed, 10 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index b2a2ed6e11..dce4f350e8 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -227,7 +227,9 @@ module ActiveRecord # This will also destroy the objects if they're declared as belongs_to and dependent on this model. # * <tt>collection=objects</tt> - replaces the collections content by deleting and adding objects as appropriate. # * <tt>collection_singular_ids=ids</tt> - replace the collection by the objects identified by the primary keys in +ids+ - # * <tt>collection.clear</tt> - removes every object from the collection. This does not destroy the objects. + # * <tt>collection.clear</tt> - removes every object from the collection. This destroys the associated objects if they + # are <tt>:dependent</tt>, deletes them directly from the database if they are <tt>:exclusively_dependent</tt>, + # and sets their foreign keys to NULL otherwise. # * <tt>collection.empty?</tt> - returns true if there are no associated objects. # * <tt>collection.size</tt> - returns the number of associated objects. # * <tt>collection.find</tt> - finds an associated object according to the same rules as Base.find. diff --git a/activerecord/lib/active_record/associations/has_many_association.rb b/activerecord/lib/active_record/associations/has_many_association.rb index f9ca655560..2c881290aa 100644 --- a/activerecord/lib/active_record/associations/has_many_association.rb +++ b/activerecord/lib/active_record/associations/has_many_association.rb @@ -87,7 +87,13 @@ module ActiveRecord # Removes all records from this association. Returns +self+ so # method calls may be chained. def clear - @association_class.update_all("#{@association_class_primary_key_name} = NULL", "#{@association_class_primary_key_name} = #{@owner.quoted_id}") + if @options[:dependent] + each { |associate| associate.destroy } + elsif @options[:exclusively_dependent] + @association_class.delete_all("#{@association_class_primary_key_name} = #{@owner.quoted_id}") + else + @association_class.update_all("#{@association_class_primary_key_name} = NULL", "#{@association_class_primary_key_name} = #{@owner.quoted_id}") + end @target = [] self end |