2011-08-16 38 views
12

我正在使用Rails 3.0。我有一个二维数组。二维数组由用户数据和布尔值组成。如何从轨道3中的二维数组数组中找到记录?

例如:[ [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]

有反正循环这样的数组吗?如何实现?

+0

这是一个简单的循环;你试过什么了?顺便说一句,你是想仅仅使用内存数组来做到这一点,还是你的目标是高效并只从数据库加载该记录? – Zabba

+0

它应该只能有效地抓取一条记录..我正在检查以下解决方案... – Bongs

回答

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

所有用户真正的标志:

my_array.select{ |user, flag| flag } 

或假:

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

我是新来的,但令人惊讶的是,当我尝试第一个命令'@m.select {| user,flag | user.id == 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

你可以做这样的事情

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

这将只返回有用户ID等于2

+0

'@ m.select {| u | u.first.id == 2}'返回所有记录。但是当我将它改为'@ m.detect {| u | u.first.id == 2}'它只返回一条记录。我是新手。你能告诉我为什么这样吗? – Bongs

+0

我发现了这个问题。不知怎的,ID设置为2的所有三个记录... – Bongs

9

相同的答案@eugen,只有语法差异(和使用检测到返回记录一维阵列,而不是2维阵列):

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

谢谢...'检测'完全按预期工作... – Bongs