Addressable::URI を使うと、割ときれいに書ける気がします。忘れるのでメモ。
require 'addressable/uri' uri = Addressable::URI.parse('http://example.com').normalize uri.query_values = (uri.query_values or {}).merge('a' => '2') uri.to_s # => "http://example.com/?a=2" uri.query_values = (uri.query_values or {}).merge('b' => '3') uri.to_s # => "http://example.com/?a=2&b=3"