# File lib/active_record/relation/spawn_methods.rb, line 5
    def merge(r)
      merged_relation = clone
      return merged_relation unless r

      ((Relation::ASSOCIATION_METHODS + Relation::MULTI_VALUE_METHODS) - [:joins, :where]).each do |method|
        value = r.send("#{method}_values""#{method}_values")
        unless value.empty?
          if method == :includes
            merged_relation = merged_relation.includes(value)
          else
            merged_relation.send("#{method}_values=""#{method}_values=", value)
          end
        end
      end

      merged_relation = merged_relation.joins(r.joins_values)

      merged_wheres = @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

        merged_wheres += [w]
      end

      merged_relation.where_values = merged_wheres

      Relation::SINGLE_VALUE_METHODS.reject {|m| m == :lock}.each do |method|
        unless (value = r.send("#{method}_value""#{method}_value")).nil?
          merged_relation.send("#{method}_value=""#{method}_value=", value)
        end
      end

      merged_relation.lock_value = r.lock_value unless merged_relation.lock_value

      # Apply scope extension modules
      merged_relation.send :apply_modules, r.extensions

      merged_relation
    end