2011-08-16 17 views
12

Pracuję nad Rails 3.0. Mam dwuwymiarową tablicę. Dwuwymiarowa tablica składa się z danych użytkownika i wartości boolowskiej.Jak znaleźć zapis z tablicy dwuwymiarowej tablicy w szynach 3?

Na przykład: [ [user1,true], [user2,true], [user3,false] ]

Wygląda to mniej więcej tak:

[ 
    [#<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], 
] 

Chcę znaleźć rekordy/wyciąg warunkowo; powiedzmy, znajdując cały wiersz, gdzie User id=2, powinien on zwracać tylko drugi wiersz, to jest [#<User id: 2, email: "[email protected]", username: "ijk">, true]

Czy istnieje jeszcze możliwość przechodzenia przez takie tablice? Jak można to osiągnąć?

+0

Jest to prosta pętla; Czego spróbowałeś do tej pory? Czy na marginesie chcesz to zrobić tylko z tablicą w pamięci, czy twoim celem jest być wydajnym i załadować tylko ten rekord z bazy danych? – Zabba

+0

powinien wydajnie pobrać tylko jeden rekord. Sprawdzam następujące rozwiązania ... – Bongs

Odpowiedz

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

wszyscy użytkownicy z prawda flag:

my_array.select{ |user, flag| flag } 

czy fałsz:

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

Jestem nowy w tym, ale zaskakująco, kiedy wypróbowałem pierwsze polecenie '@m.select {| user, flag | user.id == 2} 'zwrócił wszystkie trzy rekordy. Zamiast 'select' użyłem' detect' i zadziałało. Pozostałe dwa polecenia '@ m.select {| user, flag | flag} 'i' @ m.select {| user, flag | ! flag} 'działało bardzo dobrze. Dzięki ... – Bongs

+0

wygląda tak, jakbyś spróbował '@ m.select {| user, flag | user.id = 2} 'lub all off one with is ID = 2 – fl00r

+0

masz rację ... jakoś identyfikator został ustawiony na 2 do wszystkich rekordów .. dzięki ... – Bongs

11

można zrobić coś takiego

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

To zwróci tylko te rekordy, które mają identyfikator użytkownika równą 2.

+0

'@ m.select {| u | u.first.id == 2} 'zwracanie wszystkich rekordów. Ale kiedy zmieniłem go na '@ m.detect {| u | u.first.id == 2} 'zwrócił tylko jeden rekord. Jestem na to nowy. Czy możesz mi powiedzieć, dlaczego tak jest? – Bongs

+0

Znalazłem problem. W jakiś sposób identyfikator został ustawiony na 2 do wszystkich trzech rekordów ... – Bongs

9

samą odpowiedź jak @eugen, jedyną różnicą składni (z użyciem wykryć powrót pojedyncza tablica wymiarowa tablica zamiast 2 wymiarowej):

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

Dzięki ... "detekcja" działa dokładnie zgodnie z oczekiwaniami ... – Bongs

Powiązane problemy