鳩舎

レースしない

Rails symbolize_keys 再帰的

RailsにはHash#symbolize_keysというメソッドが用意されており、Hashのキーを文字列からシンボルにしてくれるので、これで安心だーなんて思ってると、ハッシュの中身がシンボルにならなかったりする。具体的には

{ 'key': 1
  'hash': {
    'key': 2
  }
}.symbolize_keys
# =>
{ key: 1
  hash: {
    'key': 2
  }
}

みたいな事になる。これを再帰的にしたいのでなんとかしたいという時は

class Hash
  def symbolize_keys!
    keys.each do |key|
      case (v = delete(key))
      when Hash
        v = v.symbolize_keys
      when Array
        v = v.map{|x| (x.symbolize_keys rescue x) }
      end
      self[(key.to_sym rescue key) || key] = v
    end
    self
  end
end

これでなんとかなる。配列の中のHash中のキーもちゃんとシンボルになる。YAMLにコンフィグ書いてる時とかに詰まるので要注意。