diff options
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record/relation/spawn_methods.rb | 20 |
1 files changed, 13 insertions, 7 deletions
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 |