From bb70528d0cb386a06c82d0ee0dca2b941849fa96 Mon Sep 17 00:00:00 2001 From: Akira Matsuda 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