Created
May 14, 2011 02:35
-
-
Save AquaGeek/971811 to your computer and use it in GitHub Desktop.
Rails Lighthouse ticket #6555
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From bb70528d0cb386a06c82d0ee0dca2b941849fa96 Mon Sep 17 00:00:00 2001 | |
From: Akira Matsuda <ronnie@dio.jp> | |
Date: Thu, 10 Mar 2011 18:15:33 +0900 | |
Subject: [PATCH] make sure that delete_all works when chained with joins | |
--- | |
activerecord/lib/active_record/relation.rb | 8 +++++++- | |
activerecord/test/cases/persistence_test.rb | 8 ++++++++ | |
2 files changed, 15 insertions(+), 1 deletions(-) | |
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb | |
index 5af20bf..476fd92 100644 | |
--- a/activerecord/lib/active_record/relation.rb | |
+++ b/activerecord/lib/active_record/relation.rb | |
@@ -311,7 +311,13 @@ module ActiveRecord | |
if conditions | |
where(conditions).delete_all | |
else | |
- statement = arel.compile_delete | |
+ statement = if joins_values.present? | |
+ pk = "#{@klass.connection.quote_table_name table_name}.#{primary_key}" | |
+ ids = select(pk) | |
+ unscoped { @klass.where("#{pk} in (#{ids.to_sql})").build_arel.compile_delete } | |
+ else | |
+ arel.compile_delete | |
+ end | |
affected = @klass.connection.delete statement.to_sql | |
reset | |
affected | |
diff --git a/activerecord/test/cases/persistence_test.rb b/activerecord/test/cases/persistence_test.rb | |
index 8ca9d62..e1a815a 100644 | |
--- a/activerecord/test/cases/persistence_test.rb | |
+++ b/activerecord/test/cases/persistence_test.rb | |
@@ -11,6 +11,8 @@ require 'models/project' | |
require 'models/minimalistic' | |
require 'models/warehouse_thing' | |
require 'models/parrot' | |
+require 'models/pet' | |
+require 'models/toy' | |
require 'models/minivan' | |
require 'models/loose_person' | |
require 'rexml/document' | |
@@ -56,6 +58,12 @@ class PersistencesTest < ActiveRecord::TestCase | |
assert_equal Topic.count, Topic.delete_all | |
end | |
+ def test_delete_all_with_joins | |
+ assert (count = Pet.joins(:toys).where(:toys => {:name => 'Bone'}).count) > 0 | |
+ | |
+ assert_equal count, Pet.joins(:toys).where(:toys => {:name => 'Bone'}).delete_all | |
+ end | |
+ | |
def test_update_by_condition | |
Topic.update_all "content = 'bulk updated!'", ["approved = ?", true] | |
assert_equal "Have a nice day", Topic.find(1).content | |
-- | |
1.7.4.1 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment