From dbc5d2694f0c77ca9de43306602969fdd3dbd20e Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Wed, 20 Oct 2010 08:41:18 -0700 Subject: reduce duplicate where removal to one loop --- .../lib/active_record/relation/spawn_methods.rb | 28 ++++++++++------------ 1 file changed, 13 insertions(+), 15 deletions(-) (limited to 'activerecord/lib/active_record') 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 - - 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 + merged_wheres = @where_values + r.where_values + + # 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 -- cgit v1.2.3