Ответ 1
my_array.select{ |user, flag| user.id == 2}
всех пользователей с истинным флагом:
my_array.select{ |user, flag| flag }
или false:
my_array.select{ |user, flag| !flag }
Я работаю над Rails 3.0. У меня есть двумерный массив. Двумерный массив состоит из пользовательских данных и логического значения.
Например: [ [user1,true], [user2,true], [user3,false] ]
Это выглядит примерно так:
[
[#<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],
]
Я хочу найти/извлечь записи условно; скажем, найти целую строку, где User id=2
, она должна возвращать только вторую строку, т.е. [#<User id: 2, email: "[email protected]", username: "ijk">, true]
Нужно ли все-таки перебирать такие массивы? Как это можно достичь?
my_array.select{ |user, flag| user.id == 2}
всех пользователей с истинным флагом:
my_array.select{ |user, flag| flag }
или false:
my_array.select{ |user, flag| !flag }
Вы можете сделать что-то вроде
[ [user1,true], [user2,true], [user3,false] ].select { |u| u.first.id == 2}
Это приведет к возврату только записей с идентификатором пользователя, равным 2.
Тот же ответ, что и @eugen, только разность синтаксиса (и использование метода обнаружения для возврата одномерного массива вместо 2-мерного массива):
[ [user1,true], [user2,true], [user3,false] ].detect { |user, boolean| user.id == 2 }
=> [user2, true]