diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2014-04-28 20:10:35 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2014-04-28 20:10:35 -0700 |
commit | 7763cff2981757ab6a4d5796c1d17b98a2f57f0a (patch) | |
tree | 7ba0d6f3985137885ebe3dacb55e5a9a2977cdd1 | |
parent | b7b319ec758ae5cd9394e87390813f7bd55e1787 (diff) | |
parent | 748daa39610585829cdd52810870adf8e8711bfc (diff) | |
download | rails-7763cff2981757ab6a4d5796c1d17b98a2f57f0a.tar.gz rails-7763cff2981757ab6a4d5796c1d17b98a2f57f0a.tar.bz2 rails-7763cff2981757ab6a4d5796c1d17b98a2f57f0a.zip |
Merge pull request #14899 from eileencodes/fix-delete-all-with-nil-dependency-to-not-produce-in-statement
Fix delete all with nil (:nullify) dependency to not produce in statement
4 files changed, 18 insertions, 8 deletions
diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb index 9bf253d976..1c84973920 100644 --- a/activerecord/lib/active_record/associations/collection_association.rb +++ b/activerecord/lib/active_record/associations/collection_association.rb @@ -252,10 +252,10 @@ module ActiveRecord end def delete_all_with_dependency(dependent) - if dependent == :delete_all - delete_records(:all, dependent) - else + if dependent == :destroy delete_or_destroy(load_target, dependent) + else + delete_records(:all, dependent) end end diff --git a/activerecord/test/cases/associations/callbacks_test.rb b/activerecord/test/cases/associations/callbacks_test.rb index cf71bc1597..968f36e92c 100644 --- a/activerecord/test/cases/associations/callbacks_test.rb +++ b/activerecord/test/cases/associations/callbacks_test.rb @@ -150,7 +150,7 @@ class AssociationCallbacksTest < ActiveRecord::TestCase "after_removing#{jamis.id}"], activerecord.developers_log end - def test_has_and_belongs_to_many_remove_callback_on_clear + def test_has_and_belongs_to_many_does_not_fire_callbacks_on_clear activerecord = projects(:active_record) assert activerecord.developers_log.empty? if activerecord.developers_with_callbacks.size == 0 @@ -161,7 +161,7 @@ class AssociationCallbacksTest < ActiveRecord::TestCase end log_array = activerecord.developers_with_callbacks.flat_map {|d| ["before_removing#{d.id}","after_removing#{d.id}"]}.sort assert activerecord.developers_with_callbacks.clear - assert_equal log_array, activerecord.developers_log.sort + assert_predicate activerecord.developers_log, :empty? end def test_has_many_and_belongs_to_many_callbacks_for_save_on_parent diff --git a/activerecord/test/cases/associations/has_many_associations_test.rb b/activerecord/test/cases/associations/has_many_associations_test.rb index c79c0c87c5..2f5c9d6e1b 100644 --- a/activerecord/test/cases/associations/has_many_associations_test.rb +++ b/activerecord/test/cases/associations/has_many_associations_test.rb @@ -131,6 +131,19 @@ class HasManyAssociationsTest < ActiveRecord::TestCase assert_equal(expected_sql, loaded_sql) end + def test_delete_all_on_association_with_nil_dependency_is_the_same_as_not_loaded + author = authors :david + author.posts.create!(:title => "test", :body => "body") + author.reload + expected_sql = capture_sql { author.posts.delete_all } + + author.posts.create!(:title => "test", :body => "body") + author.reload + author.posts.to_a + loaded_sql = capture_sql { author.posts.delete_all } + assert_equal(expected_sql, loaded_sql) + end + def test_building_the_associated_object_with_implicit_sti_base_class firm = DependentFirm.new company = firm.companies.build diff --git a/activerecord/test/cases/associations/has_many_through_associations_test.rb b/activerecord/test/cases/associations/has_many_through_associations_test.rb index e68ad74f70..2e62189e7a 100644 --- a/activerecord/test/cases/associations/has_many_through_associations_test.rb +++ b/activerecord/test/cases/associations/has_many_through_associations_test.rb @@ -698,9 +698,6 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase [:added, :before, "Roger"], [:added, :after, "Roger"] ], log.last(4) - - post.people_with_callbacks.clear - assert_equal((%w(Michael David Julian Roger) * 2).sort, log.last(8).collect(&:last).sort) end def test_dynamic_find_should_respect_association_include |