Я второй @ ответ Стефена, при условии, что нет необходимости поддерживать версии Ruby до версии 2.5, когда дебютировал Hash # transform_keys! .Если более ранние версии должны поддерживаться, здесь есть один способ (который не создает новый хеш), расширение подхода, упомянутого в OP.
h = { foo: 1, bar: 2, baz: 3 }
h.keys.each { |k| h[k == :bar ? :qux : k] = h.delete(k) }
#=> [:foo, :bar, :baz]
h #=> {:foo=>1, :qux=>2, :baz=>3}
Обратите внимание, что перечислители Hash # each_key и Хэш # каждый не может использоваться, поскольку ключи удаляются во время итерации.
Другой выбор следующий:
keys = h.keys
keys[keys.index(:bar)] = :qux
h.replace(keys.zip(h.values).to_h)
#=> {:foo=>1, :qux=>2, :baz=>3}