2011-08-16 9 views
12

Estoy trabajando en Rails 3.0. Tengo una matriz bidimensional. La matriz bidimensional consiste en datos de usuario y un valor booleano.¿Cómo encontrar el registro de una matriz de dos dimensiones en los carriles 3?

Por ejemplo: [ [user1,true], [user2,true], [user3,false] ]

se ve algo como esto:

[ 
    [#<User id: 1, email: "[email protected]", username: "abc">, true], 
    [#<User id: 2, email: "[email protected]", username: "ijk">, true], 
    [#<User id: 3, email: "[email protected]", username: "xyz">, false], 
] 

Quiero encontrar registros/extracto condicionalmente; supongamos que al buscar una fila completa donde User id=2, debe devolver solo la segunda fila, es decir [#<User id: 2, email: "[email protected]", username: "ijk">, true]

¿Hay alguna forma de recorrer estas matrices? ¿Cómo puede lograrse?

+0

Es un bucle sencillo; ¿Qué has intentado hasta ahora? Por otro lado, ¿desea hacer esto solo con una matriz en memoria o su objetivo es ser eficiente y cargar solo ese registro desde la base de datos? – Zabba

+0

debería buscar de manera eficiente solo un registro ... Estoy comprobando las siguientes soluciones ... – Bongs

Respuesta

23
my_array.select{ |user, flag| user.id == 2} 

todos los usuarios con bandera verdadera:

my_array.select{ |user, flag| flag } 

o falso:

my_array.select{ |user, flag| !flag } 
+1

Soy nuevo en esto, pero sorprendentemente cuando lo intenté primero comando '@m.select {| usuario, bandera | user.id == 2} 'devolvió los tres registros. Entonces, en lugar de 'seleccionar', utilicé' detectar' y funcionó. Los otros dos comandos '@ m.select {| user, flag | flag} 'y' @ m.select {| user, flag | ! flag} 'funcionó muy bien. Gracias ... – Bongs

+0

parece que intentas '@ m.select {| user, flag | user.id = 2} 'o todos ellos están con ID = 2 – fl00r

+0

tiene razón ... de alguna manera la identificación se estableció en 2 en todos los registros ... gracias ... – Bongs

11

Usted puede hacer algo como

[ [user1,true], [user2,true], [user3,false] ].select { |u| u.first.id == 2} 

Esto devolverá sólo los registros que tienen el identificador de usuario igual a 2.

+0

'@ m.select {| u | u.first.id == 2} 'devolviendo todos los registros. Pero cuando lo cambié a '@ m.detect {| u | u.first.id == 2} 'devolvió solo un registro. Soy nuevo en eso. ¿Puedes decirme por qué es así? – Bongs

+0

Encontré el problema. De alguna manera, la identificación se estableció en 2 en los tres registros ... – Bongs

9

La misma respuesta que @eugen, única diferencia de sintaxis (y que utilizan para volver a detectar matriz unidimensional en lugar de 2 matriz unidimensional):

[ [user1,true], [user2,true], [user3,false] ].detect { |user, boolean| user.id == 2 } 
=> [user2, true] 
+0

Gracias ... el 'detectar' funciona exactamente como se esperaba ... – Bongs

Cuestiones relacionadas