2011-08-16 28 views
12

Rails 3.0 üzerinde çalışıyorum. İki boyutlu bir dizim var. İki boyutlu dizi, kullanıcı verisinden ve bir boole değerinden oluşur.Raylarda 3 bir dizi iki boyutlu dizi kayıt nasıl bulunur?

Örneğin: [ [user1,true], [user2,true], [user3,false] ]

Bu şuna benzer: Ben şartlı/özü kayıtları bulmak istiyorum

[ 
    [#<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 nolu bir satırın tamamını bulmak için, sadece ikinci sıraya (yani, [#<User id: 2, email: "[email protected]", username: "ijk">, true]

) bir satır bulmak gerektiğini söyleyiniz mi? Nasıl başarılabilir?

+0

Basit bir döngü; şu ana kadar ne denedin? Bir kenara göre, bunu sadece bir bellek içi diziyle yapmak mı istiyorsunuz, yoksa hedefiniz etkin olmak ve sadece veritabanından gelen kaydı yüklemek mi istiyorsunuz? – Zabba

+0

sadece bir kayıt etkin bir şekilde almalıdır. Aşağıdaki çözümleri kontrol ediyorum ... – Bongs

cevap

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

tüm kullanıcılar ile Gerçek bayrak:

my_array.select{ |user, flag| flag } 

veya yanlış:

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

Bu konuda yeniyim, ama ilk komutu denediğimde şaşırtıcı bir şekilde '@m.select {| kullanıcı, bayrak | user.id == 2} 'üç kaydı da geri gönderdi. Yani 'select' yerine' '' dediğini kullandı ve işe yaradı. Diğer iki komut '@ m.select {| kullanıcı, bayrak | flag} 've' @ m.select {| kullanıcı, bayrak | ! bayrak} 'çok iyi çalıştı. Teşekkürler ... – Bongs

+0

denediğiniz gibi görünüyor @ m.select {| user, flag | user.id = 2} 'veya bunların tümü ID = 2 – fl00r

+0

ile vardır, haklısınız ... bir şekilde kimlik tüm kayıtlara 2 olarak ayarlandı .. teşekkürler ... – Bongs

11

Sen

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

Bu @eugen, sadece sözdizimi farkı (2.

+0

'@ m.select {| u | u.first.id == 2} 'tüm kayıtları geri döndürüyor. Ama onu değiştirdiğimde @ m.detect {| u | u.first.id == 2} 'sadece bir kayıt döndürdü. Ben yeniyim. Bana neden böyle olduğunu söyleyebilir misin? – Bongs

+0

Sorunu buldum. Her nasılsa kimliği üç kayıt için 2'ye ayarlandı ... – Bongs

9

aynı cevabı eşit kullanıcı kimliği ve geri dönmek için tespit kullanan tek kayıtları döndürür gibi bir şey yapabilirsiniz tek boyutlu dizi yerine 2 boyutlu dizi):

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

Teşekkürler ... 'dediğini 'tam olarak beklendiği gibi çalışır ... – Bongs