tutorial rails que ejemplos descargar curso caracteristicas ruby-on-rails ruby ruby-on-rails-3 hash

ruby-on-rails - que - ruby on rails tutorial



Cómo reemplazar una clave hash con otra clave (7)

Rails Hash tiene un método estándar para ello:

hash.transform_keys{ |key| key.to_s.upcase }

http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys

UPD: método ruby ​​2.5

Tengo una condición donde, obtengo un hash

hash = {"_id"=>"4de7140772f8be03da000018", .....}

y quiero este hash como

hash = {"id"=>"4de7140772f8be03da000018", ......}

PD : No sé cuáles son las claves en el hash, son aleatorias que vienen con un prefijo "_" para cada tecla y no quiero guiones bajos


Si queremos cambiar el nombre de una clave específica en hash, podemos hacerlo de la siguiente manera:
Supongamos que mi hash es my_hash = {''test'' => ''ruby hash demo''}
Ahora quiero reemplazar ''prueba'' por ''mensaje'', entonces:
my_hash[''message''] = my_hash.delete(''test'')


Si todas las claves son cadenas y todas tienen el prefijo del guión bajo, entonces puedes remendar el hash en su lugar con esto:

h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }

El bit k[1, k.length - 1] toma todos k excepto el primer carácter. Si quieres una copia, entonces:

new_h = Hash[h.map { |k, v| [k[1, k.length - 1], v] }]

O

new_h = h.inject({ }) { |x, (k,v)| x[k[1, k.length - 1]] = v; x }

También puede usar sub si no le gusta la notación k[] para extraer una subcadena:

h.keys.each { |k| h[k.sub(//A_/, '''')] = h[k]; h.delete(k) } Hash[h.map { |k, v| [k.sub(//A_/, ''''), v] }] h.inject({ }) { |x, (k,v)| x[k.sub(//A_/, '''')] = v; x }

Y, si solo algunas de las claves tienen el prefijo de subrayado:

h.keys.each do |k| if(k[0,1] == ''_'') h[k[1, k.length - 1]] = h[k] h.delete(k) end end

Se pueden hacer modificaciones similares a todas las otras variantes anteriores, pero estas dos:

Hash[h.map { |k, v| [k.sub(//A_/, ''''), v] }] h.inject({ }) { |x, (k,v)| x[k.sub(//A_/, '''')] = v; x }

debería estar bien con las claves que no tienen los prefijos de subrayado sin modificaciones adicionales.


tu puedes hacer

hash.inject({}){|option, (k,v) | option["id"] = v if k == "_id"; option}

Esto debería funcionar para tu caso!


h.inject({}) { |m, (k,v)| m[k.sub(/^_/,'''')] = v; m }


hash.each {|k,v| hash.delete(k) && hash[k[1..-1]]=v if k[0,1] == ''_''}


hash[:new_key] = hash.delete :old_key