12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ActiveRecordからHashに変換するときにKeyをSymbolにしたい

Last updated at Posted at 2018-10-19

TL;DR

とある設定値(Hash)をDBから取得した値に更新したかった。
ところが hash.merge(Model.attributes) すると String型とSymbol型のキーで重複した値ができてしまった。
これをなんとかしたくていろいろググってしまったが非常にシンプルな解決策があったのだけどそこにたどり着くまでにそこそこ時間がかかってしまったという訓戒。

結論:

attributesで取得したHashに対してsymbolize_keysすればよい。

pry(main)> {"name" => 'hoge fuga', "age" => 17}.symbolize_keys
=> {:name=>"hoge fuga", :age=>17}

ActiveRecordからHashにする方法はいくつか出てきたのだけどそのHashがString型で少し困る事態が発生してしまった。
可能ならキーはSymbol型が嬉しいのだけどattributesが返すHashはString型だったのでうまく意図したデータになってくれなかった。

with_indifferent_accessでキーがString型でもSymbol型でもどっちでもOKになるのだけど出来れば厳密にしたかったためSymbol型に変換した状態でマージをするためにはどうすればいいのだろうか?と考えていた。

当初はHashの中身をループさせて変換されたものを再代入すればいいかと思っていたのだがそんな泥臭い方法しないといけないのだろうか?と気になって調べ直したところ、↓のエントリにたどり着き自分がやりたかったことがシュッと実現できる運びになってHappy!という感じです。

Railsでハッシュのキーをシンボルに変換

ちなみに泥臭い感じのコードは↓と全く同じでした。
Hashのキーを文字列からシンボルに変換する

HashのキーがString型もSymbol型も許容するのはいいのだけど内部的にはSymbol型で統一してほしいという気持ちがある。
とはいえそれをしてしまうとString型とSymbol型で異なるキーだと判断しているいまのHashの振る舞いが変わってしまうので難しいんだろうなーと思うとなかなかつらみ。

12
8
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?