Leventix, obrigado pela sua resposta.
O método Marshal.load (Marshal.dump (h)) provavelmente tem a maior integridade dos vários métodos porque preserva os tipos de chave originais recursivamente .
Isso é importante no caso de você ter um hash aninhado com uma mistura de strings e chaves de símbolo e deseja preservar essa mistura na decodificação (por exemplo, isso pode acontecer se o seu hash contiver seus próprios objetos personalizados além do terceiro altamente complexo / aninhado -party objetos cujas chaves você não pode manipular / converter por qualquer motivo, como uma restrição de tempo do projeto).
Por exemplo:
h = {
:youtube => {
:search => 'daffy', # nested symbol key
'history' => ['goofy', 'mickey'] # nested string key
}
}
Método 1 : JSON.parse - simboliza todas as chaves recursivamente => Não preserva a mistura original
JSON.parse( h.to_json, {:symbolize_names => true} )
=> { :youtube => { :search=> "daffy", :history => ["goofy", "mickey"] } }
Método 2 : ActiveSupport :: JSON.decode - simboliza apenas as chaves de nível superior => Não preserva a mistura original
ActiveSupport::JSON.decode( ActiveSupport::JSON.encode(h) ).symbolize_keys
=> { :youtube => { "search" => "daffy", "history" => ["goofy", "mickey"] } }
Método 3 : Marshal.load - preserva a combinação original de string / símbolo nas chaves aninhadas. PERFEITO!
Marshal.load( Marshal.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
A menos que haja uma desvantagem da qual eu não saiba, acho que o Método 3 é o melhor.
Felicidades
http://stackoverflow.com/a/43773159/1297435
para rails 4.1