軽く捜しても意外と見つからない思いを何度かしたので、書いておく。
class Hash
def symbolize_keys
self.each_with_object({}){|(k,v),memo| memo[k.to_s.to_sym]=v}
end
def deep_symbolize_keys
self.each_with_object({}){|(k,v),memo| memo[k.to_s.to_sym]=(v.is_a?(Hash) ? v.deep_symbolize_keys : v)}
end
end
h = {'a' => {'b' => 123, 'c' => 789, 123 => 'a'}, 'x' => 123, :foo => 'bar'}
h.symbolize_keys
#=> {:a=>{"b"=>123, "c"=>789, 123=>"a"}, :x=>123, :foo=>"bar"}
h.deep_symbolize_keys
#=> {:a=>{:b=>123, :c=>789, :"123"=>"a"}, :x=>123, :foo=>"bar"}
Railsの実装とは少し違うけど、充分な範囲で。