From 8c511c0b3ce02df75e8c089cb6cfd4e0a958a0cf Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 19 Oct 2010 20:53:53 -0700 Subject: swap out some n^2 for some n --- .../lib/active_record/relation/spawn_methods.rb | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 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 e644670019..b8b0898cc8 100644 --- a/activerecord/lib/active_record/relation/spawn_methods.rb +++ b/activerecord/lib/active_record/relation/spawn_methods.rb @@ -26,15 +26,21 @@ module ActiveRecord merged_relation = merged_relation.joins(r.joins_values) - merged_wheres = @where_values.dup + merged_wheres = @where_values.dup + r.where_values - r.where_values.each do |w| - if w.respond_to?(:operator) && w.operator == :== - merged_wheres = merged_wheres.reject {|p| p.respond_to?(:operator) && p.operator == :== && p.operand1.name == w.operand1.name } - end + equality_wheres = merged_wheres.find_all { |w| + w.respond_to?(:operator) && w.operator == :== + } - merged_wheres << w - end + 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_relation.where_values = merged_wheres -- cgit v1.2.3