Ruby
Rails
配列

配列っぽい文字列をうまく配列に変換する

More than 1 year has passed since last update.


前提

databaseに配列っぽい括弧でくくられたただの文字列があります。

["hoge","fuga"]

でもいざRails内でmodelを通して取り出すとこんな形になってます。

"[\"hoge\",\"fuga\"]"

つらい


標準メソッドでどうにかならないか

https://docs.ruby-lang.org/ja/latest/class/Array.html

結論:ならない(っぽい)

Array.new(["hoge","fuga"]) のような形ならどうにかなるのですが( []もArrayなので当たり前)、今回のケースの場合はmodelから取り出した時点で文字列なのでうまいことやらないと配列にはキャストできません。

当然Stringに.to_aryメソッドはありませんのでArray.try_convertもnilが返ります。


結論

結論としては、splitで無理やり分割し、deleteで余分な文字列を消すことにより強制的に配列にしました。このケースで対応できない場合もあるかもしれませんが、その際はうまくやりましょう。

[1] pry(main)> hoge = model.column

=> "[\"hoge\",\"fuga\"]"
[2] pry(main)> hoge_a = hoge.split(',').map { |m| m.delete('[]"\\\\')}
=> ["hoge", "fuga"]

僕はあまりやりたくありませんが、evalでやる方法もあります。こっちの方が綺麗ですがevalなのであしからず。

[1] pry(main)> hoge = model.column

=> "[\"hoge\",\"fuga\"]"
[2] pry(main)> hoge_a = eval(hoge)
=> ["hoge", "fuga"]