Tengo una condición en la que tengo 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, lo que viene con un prefijo "_" para cada clave y no quiero subrayados
                    
                        ruby-on-rails
                                ruby
                                ruby-on-rails-3
                                hash
                                
                    
                    
                        Manish Das
fuente
                
                fuente

_idclavesiden una serie de documentos MongoDBRespuestas:
fuente
hash.delete :old_keydevuelve y la eliminación utiliza la clave anterior. WOW, lo quiero tatuado en alguna parte :-D Graciasrails Hash tiene un método estándar para ello:
http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys
UPD: método ruby 2.5
fuente
Si todas las teclas son cadenas y todas tienen el prefijo de subrayado, entonces puede parchear el hash en su lugar con esto:
El
k[1, k.length - 1]bit agarra todokexcepto el primer personaje. Si quieres una copia, entonces:O
También puede usar
subsi no le gusta lak[]notación para extraer una subcadena:Y, si solo algunas de las teclas tienen el prefijo de subrayado:
Se pueden hacer modificaciones similares a todas las otras variantes anteriores, pero estas dos:
debería estar bien con las teclas que no tienen prefijos de subrayado sin modificaciones adicionales.
fuente
tu puedes hacer
¡Esto debería funcionar para su caso!
fuente
Si queremos cambiar el nombre de una clave específica en hash, entonces 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')fuente
hash[:new_key] = has[:old_key]en su lugar es:hash[:dynamic_key] = hash[:_dynamic_key]era una pregunta clara sobre expresiones regulares y no un simple reemplazo de hash.fuente
fuente
Fui exagerado y se me ocurrió lo siguiente. Mi motivación detrás de esto fue agregar claves de hash para evitar conflictos de alcance al fusionar / aplanar hashes.
Ejemplos
Extender clase de hash
Agrega el método rekey a las instancias de Hash.
Ejemplo de anteponer
Ejemplo de recorte
Acoplar y anexar un "alcance"
Si devuelve un hash para volver a escribir, combinará el hash que le permite aplanar colecciones. Esto nos permite agregar alcance a nuestras claves al aplanar un hash para evitar sobrescribir una clave al fusionar.
fuente
Las respuestas anteriores son lo suficientemente buenas, pero podrían actualizar los datos originales. En caso de que no desee que se vean afectados los datos originales, puede probar mi código.
Primero ignorará la clave '_id' y luego se fusionará con la actualizada.
fuente