2011-08-16 9 views
12

私はRails 3.0を開発中です。私は2次元の配列を持っています。 2次元配列は、ユーザデータとブール値で構成されます。例えばレール3の2次元配列の配列からレコードを見つけるには?

[ [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の場合、2行目のみを返す必要があります。つまり、[#<User id: 2, email: "[email protected]", username: "ijk">, true]

このような配列をループするにはどうしますか?どのように達成することができますか?あなたはこれが@eugenとして2

+0

それは単純なループです。これまでに何を試しましたか?さて、メモリ内の配列でのみこれをやりたいのですか効率的で、そのレコードだけをデータベースからロードすることが目標ですか? – Zabba

+0

それは効率的に1つのレコードをフェッチする必要があります。私は次のソリューションをチェックしています... – Bongs

答えて

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

すべてのユーザーとtrueフラグ:

my_array.select{ |user, flag| flag } 

またはfalse:

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

私はこれに慣れていませんが、驚いたことに、' @m.select {| user、flag | user.id == 2} 'それは3つのレコードすべてを返しました。そこで 'select'の代わりに' detect'を使いました。他の2つのコマンド '@ m.select {| user、flag |フラグ} 'と' @ m.select {| user、flag | !flag} '非常にうまくいった。ありがとう... – Bongs

+0

は、あなたが '@ m.select {| user、flag | user.id = 2} 'またはそれらのすべてがID = 2となっている – fl00r

+0

あなたは正しいと思います...何とかIDは2のすべてのレコードに設定されています..ありがとう... – Bongs

11

、構文のみ差(および使用しては返すように検出します代わりに、2次元アレイの1次元アレイ):

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

'@ m.select {| u | u.first.id == 2} 'すべてのレコードを返します。しかし、それを '@ m.detect {| u | u.first.id == 2} 'それはただ一つのレコードを返しました。私はそれが初めてです。それがなぜそうだと教えてくれますか? – Bongs

+0

問題が見つかりました。どういうわけかIDは3つのレコードすべてに対して2に設定されていました... – Bongs

9

同じ答えに等しいユーザーIDを持つレコードのみが返されます

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

ような何かを行うことができます

+0

ありがとうございました... 'detect'はまさに期待どおりに動作します... – Bongs

関連する問題