Skip to content

Instantly share code, notes, and snippets.

@AquaGeek
Created May 14, 2011 02:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AquaGeek/971811 to your computer and use it in GitHub Desktop.
Save AquaGeek/971811 to your computer and use it in GitHub Desktop.
Rails Lighthouse ticket #6555
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