From dbc5d2694f0c77ca9de43306602969fdd3dbd20e Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Wed, 20 Oct 2010 08:41:18 -0700 Subject: [PATCH] reduce duplicate where removal to one loop --- .../active_record/relation/spawn_methods.rb | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/activerecord/lib/active_record/relation/spawn_methods.rb b/activerecord/lib/active_record/relation/spawn_methods.rb index b8b0898cc8..648a02f1cc 100644 --- a/activerecord/lib/active_record/relation/spawn_methods.rb +++ b/activerecord/lib/active_record/relation/spawn_methods.rb @@ -26,21 +26,19 @@ module ActiveRecord merged_relation = merged_relation.joins(r.joins_values) - merged_wheres = @where_values.dup + r.where_values + merged_wheres = @where_values + r.where_values - equality_wheres = merged_wheres.find_all { |w| - w.respond_to?(:operator) && w.operator == :== - } - - equality_wheres_by_operand = equality_wheres.group_by { |eq| - eq.left.name - } - - duplicates = equality_wheres_by_operand.map { |name, list| - list[0...-1] - }.flatten - - merged_wheres -= duplicates + # Remove duplicates, last one wins. + seen = {} + merged_wheres = merged_wheres.reverse.reject { |w| + nuke = false + if w.respond_to?(:operator) && w.operator == :== + name = w.left.name + nuke = seen[name] + seen[name] = true + end + nuke + }.reverse merged_relation.where_values = merged_wheres