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