From fec85cf10d831ab90386a549ea558b0dd58a813f Mon Sep 17 00:00:00 2001 From: Jon Leighton Date: Sat, 19 Nov 2011 14:10:21 +0000 Subject: [PATCH] Perf fix If we're deleting all records in an association, don't add a IN(..) clause to the query. Fixes #3672. --- activerecord/CHANGELOG.md | 5 +++++ .../active_record/associations/has_many_association.rb | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 00014f858c..c50229e779 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -67,6 +67,11 @@ ## Rails 3.1.3 (unreleased) ## +* Perf fix: If we're deleting all records in an association, don't add a IN(..) clause + to the query. *GH 3672* + + *Jon Leighton* + * Fix bug with referencing other mysql databases in set_table_name. *GH 3690* * Fix performance bug with mysql databases on a server with lots of other databses. *GH 3678* diff --git a/activerecord/lib/active_record/associations/has_many_association.rb b/activerecord/lib/active_record/associations/has_many_association.rb index 50ee60284c..3353cdf1ef 100644 --- a/activerecord/lib/active_record/associations/has_many_association.rb +++ b/activerecord/lib/active_record/associations/has_many_association.rb @@ -89,8 +89,12 @@ module ActiveRecord records.each { |r| r.destroy } update_counter(-records.length) unless inverse_updates_counter_cache? else - keys = records.map { |r| r[reflection.association_primary_key] } - scope = scoped.where(reflection.association_primary_key => keys) + scope = scoped + + unless records == load_target + keys = records.map { |r| r[reflection.association_primary_key] } + scope = scoped.where(reflection.association_primary_key => keys) + end if method == :delete_all update_counter(-scope.delete_all)