Skip to content
Browse files

fix ActiveRecord `destroy_all` so it returns destroyed records

Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
  • Loading branch information...
1 parent 951dbf0 commit 00f1cd71a97bfa79e6b62a870b09ca914c48e421 @mislav mislav committed with jeremy Jul 8, 2010
View
7 activerecord/lib/active_record/associations/association_collection.rb
@@ -253,9 +253,10 @@ def clear
# See destroy for more info.
def destroy_all
load_target
- destroy(@target)
- reset_target!
- reset_named_scopes_cache!
+ destroy(@target).tap do
+ reset_target!
+ reset_named_scopes_cache!
+ end
end
def create(attrs = {})
View
3 activerecord/lib/active_record/relation.rb
@@ -213,8 +213,7 @@ def destroy_all(conditions = nil)
if conditions
where(conditions).destroy_all
else
- to_a.each {|object| object.destroy}
- reset
+ to_a.each {|object| object.destroy }.tap { reset }
end
end
View
7 activerecord/test/cases/associations/has_many_associations_test.rb
@@ -817,8 +817,11 @@ def test_destroying_a_collection
def test_destroy_all
force_signal37_to_load_all_clients_of_firm
- assert !companies(:first_firm).clients_of_firm.empty?, "37signals has clients after load"
- companies(:first_firm).clients_of_firm.destroy_all
+ clients = companies(:first_firm).clients_of_firm.to_a
+ assert !clients.empty?, "37signals has clients after load"
+ destroyed = companies(:first_firm).clients_of_firm.destroy_all
+ assert_equal clients.sort_by(&:id), destroyed.sort_by(&:id)
+ assert destroyed.all? { |client| client.frozen? }, "destroyed clients should be frozen"
assert companies(:first_firm).clients_of_firm.empty?, "37signals has no clients after destroy all"
assert companies(:first_firm).clients_of_firm(true).empty?, "37signals has no clients after destroy all and refresh"
end
View
20 activerecord/test/cases/base_test.rb
@@ -651,16 +651,24 @@ def test_table_name_guesses_with_inherited_prefixes_and_suffixes
end
def test_destroy_all
- original_count = Topic.count
- topics_by_mary = Topic.count(:conditions => mary = "author_name = 'Mary'")
-
- Topic.destroy_all mary
- assert_equal original_count - topics_by_mary, Topic.count
+ conditions = "author_name = 'Mary'"
+ topics_by_mary = Topic.all(:conditions => conditions, :order => 'id')
+ assert ! topics_by_mary.empty?
+
+ assert_difference('Topic.count', -topics_by_mary.size) do
+ destroyed = Topic.destroy_all(conditions).sort_by(&:id)
+ assert_equal topics_by_mary, destroyed
+ assert destroyed.all? { |topic| topic.frozen? }, "destroyed topics should be frozen"
+ end
end
def test_destroy_many
+ clients = Client.find([2, 3], :order => 'id')
+
assert_difference('Client.count', -2) do
- Client.destroy([2, 3])
+ destroyed = Client.destroy([2, 3]).sort_by(&:id)
+ assert_equal clients, destroyed
+ assert destroyed.all? { |client| client.frozen? }, "destroyed clients should be frozen"
end
end

0 comments on commit 00f1cd7

Please sign in to comment.
Something went wrong with that request. Please try again.