Cómo simbolizar elegantemente_keys para un hash 'anidado'
Considere el siguiente código:
hash1 = {"one" => 1, "two" => 2, "three" => 3}
hash2 = hash1.reduce({}){ |h, (k,v)| h.merge(k => hash1) }
hash3 = hash2.reduce({}){ |h, (k,v)| h.merge(k => hash2) }
hash4 = hash3.reduce({}){ |h, (k,v)| h.merge(k => hash3) }
hash4 es un hash 'anidado', es decir, un hash con claves de cadena y valores hash similares 'anidados'.
El método 'symbolize_keys' para Hash en Rails nos permite convertir fácilmente las teclas de cadena en símbolos. Pero estoy buscando unelegante forma de convertir todas las claves (claves principales más claves de todos los hashes dentro de hash4) en símbolos.
El punto es salvarme de mi (imo) solución fea:
class Hash
def symbolize_keys_and_hash_values
symbolize_keys.reduce({}) do |h, (k,v)|
new_val = v.is_a?(Hash) ? v.symbolize_keys_and_hash_values : v
h.merge({k => new_val})
end
end
end
hash4.symbolize_keys_and_hash_values #=> desired result
FYI: la configuración es Rails 3.2.17 y Ruby 2.1.1
Actualizar:
La respuesta eshash4.deep_symbolize_keys
para rieles <= 5.0
La respuesta esJSON.parse(JSON[hash4], symbolize_names: true)
para rieles> 5