Railsの実装だと、ハッシュ構造の途中に配列が挟まった場合に、それ以下の階層が処理されないことに気づく。
{'a'=>[{'b'=>100}, {'c'=>999}]}.deep_symbolize_keys
# => {:a=>[{"b"=>100}, {"c"=>999}]}
これも辿れるものを。
class Hash
def deep_symbolize_keys
self.each_with_object({}) do |(key, val), memo|
if val.is_a?(Array)
val = val.map{|v| v.deep_symbolize_keys}
elsif val.is_a?(Hash)
val = val.deep_symbolize_keys
end
memo[key.to_s.to_sym] = val
end
end
end
{'a'=>[{'b'=>100}, {'c'=>999}]}.deep_symbolize_keys
# => {:a=>[{:b=>100}, {:c=>999}]}
今回はRailsの外でオレオレ実装したい場合だったので、これで。Rails上でやりたい場合は大胆に deep_transform_keys
から上書きしちゃうか、別名をつけてやるのが良いかと。