Dado que tengo el siguiente hash de clientes , ¿hay una forma rápida de rubí (sin tener que escribir un script de varias líneas) para obtener la clave dada que quiero que coincida con el id_cliente? Por ejemplo, ¿cómo obtener la clave client_id == "2180"?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}

findyselectes quefinddevuelve la primera coincidencia yselect(aliasfindAll) devuelve todas las coincidencias.invert) solo para encontrar un elemento.clients.select{|key, hash| hash["client_id"] == "2180" } # => {"orange"=>{"client_id"=>"2180"}}clients.select{|key, hash| hash["client_id"] == "2180" }.keysRuby 1.9 y superior:
Ruby 1.8 :
Podrías usar
hash.indexEntonces, para obtener
"orange", puedes usar:fuente
index.Hash#indexes renombradoHash#keyen Ruby 1.9Puedes invertir el hash.
clients.invert["client_id"=>"2180"]devoluciones"orange"fuente
Podría usar hashname.key (valuename)
O, una inversión puede estar en orden.
new_hash = hashname.invertte dará unanew_hashque te permite hacer las cosas más tradicionalmente.fuente
#invertes una muy mala idea en este caso, ya que esencialmente está asignando memoria para objetos hash desechables solo por el hecho de encontrar una clave. Dependiendo del tamaño del hash, tiene un serio impacto en el rendimientoprueba esto:
fuente
.try(:first)lugar de.firstevitar excepciones (si espera que sea posible que falte el valor).Ruby 2.3.0 +puede usar un navegador seguro&.firstal final del bloque para evitar una excepciónDe acuerdo con Ruby Doc, http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key key (value) es el método para encontrar la clave en la base del valor.
devolverá el "diseñador".
fuente
De los documentos:
Pasa cada entrada en la enumeración para bloquear. Devuelve el primero para el que el bloque no es falso. Si ningún objeto coincide, llama a ifnone y devuelve su resultado cuando se especifica, o devuelve nil de lo contrario.
Si no se proporciona ningún bloque, se devuelve un enumerador.
Esto funcionó para mí:
Ver: http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method
fuente
La mejor manera de encontrar la clave para un valor particular es utilizar el método de clave que está disponible para un hash ...
Espero que resuelva tu problema ...
fuente
Otro enfoque que intentaría es usar
#mapEsto devolverá todas las ocurrencias de un valor dado. El guión bajo significa que no necesitamos que el valor de la clave se transfiera de modo que no se asigne a una variable. La matriz contendrá nils si los valores no coinciden, es por eso que pongo
#compactal final.fuente
Aquí hay una manera fácil de encontrar las claves de un valor dado:
... y para encontrar el valor de una clave dada:
te dará el par clave-valor.
fuente