Rails シンボルのハッシュと文字列のハッシュをマージしたい

rails

問題

キーがSymbol のハッシュ

hash_a = { :a => '', :b => '' }

キーがString のハッシュ

hash_b= { 'a' => '1', 'b' => '2' }

これらをマージしても値が上書きされません。

hash_a.merge(hash_b)
=> { :a=>"", :b=>"", "a"=>"1", "b"=>"2" }

求めていたのはこんな感じです。

{ :a=>'1', :b=>'2' }

解決法

with_indifferent_accessを使えば解決できました。

キーがSymbol のハッシュをString のに変換してくれます。

hash_a = { :a => '', :b => '' }.with_indifferent_access
=> { "a"=>"", "b"=>"" }

これでマージすると求めていた結果になります。

hash_a.merge(hash_b)
=> { "a"=>"1", "b"=>"2" }

おわりに

最初はSymbol のハッシュをString で記述して解決しようとしていましたが、スッキリ解決できる方法があってよかったです。
データセッションに入れた時にどうしてもString のハッシュになってしまうから、そこに上書きでマージするには必要でした。

参考文献

ありがとうございます!