Ruby 迭代列表以将数组附加到键/值对

Ruby 迭代列表以将数组附加到键/值对,ruby,arrays,hash,Ruby,Arrays,Hash,我有一个如下的清单 ID MODEL 001 Model A 001 Model B 001 Model C 002 Model A 002 Model B 002 Model D 我必须根据我目前正在使用的ID执行查询。它当前正在列表中的每行执行一个查询。似乎减少我必须运行的查询的数量要快得多 我想如果我有一个像这样的杂烩: { :001 => ["Model A", "Model B", "Model C"], :002 => ["Model A

我有一个如下的清单

ID    MODEL
001   Model A
001   Model B
001   Model C
002   Model A
002   Model B
002   Model D
我必须根据我目前正在使用的ID执行查询。它当前正在列表中的每行执行一个查询。似乎减少我必须运行的查询的数量要快得多

我想如果我有一个像这样的杂烩:

{
:001 => ["Model A", "Model B", "Model C"], 
:002 => ["Model A", "Model B", "Model D"]
}
id = parsed_line[0]
model = parsed_line[1]
hash["#{id}"] = models << model
{
:001 => ["Model A", "Model B", "Model C", "Model A", "Model B", "Model D"], 
:002 => ["Model A", "Model B", "Model C", "Model A", "Model B", "Model D"]
}
我将能够执行更少的查询

我遇到的问题是,如何确定可以在这样的列表上进行迭代并生成所需的哈希

现在,我的代码如下所示:

{
:001 => ["Model A", "Model B", "Model C"], 
:002 => ["Model A", "Model B", "Model D"]
}
id = parsed_line[0]
model = parsed_line[1]
hash["#{id}"] = models << model
{
:001 => ["Model A", "Model B", "Model C", "Model A", "Model B", "Model D"], 
:002 => ["Model A", "Model B", "Model C", "Model A", "Model B", "Model D"]
}

我理解为什么会发生这种情况,但我不知道如何获得所需的哈希

我猜您没有任何数据库。如果您只有一个二维数组,并且希望将其转换为散列,那么这就是您应该做的

model_array= [["001", "Model A"], ["001", "Model B"], ["001", "Model C"], ["002", "Model A"], ["002", "Model B"], ["002", "Model D"]]

hash = {}
model_arrays.each do |arr|
  hash[arr[0]] ||= []
  hash[arr[0]] << arr[1]
end
我在这里假设解析的_行是一个数组,看起来像这样:[001,模型A]。我不知道什么是模型,但我猜这是没有必要的。这样的事情应该行得通:

parsed_lines = [ [ "001", "Model A" ],
                 [ "002", "Model B" ],
                 # ...
               ]

hash = {}

parsed_lines.each do |id, model|
  hash[id] ||= []
  hash[id] << model
end

这个单行sans声明解析的_行怎么样


但最好按照@ArupRakshit所说的做,使用分组查询,跳过这个额外的处理步骤。

我不知道您使用的是哪个数据库适配器和数据库。。。但我确信您需要使用group by sql查询。要解决此问题,..query可能是-select id,select model from table where id=table.id from table group by id………您的代码没有告诉我们解析的行是什么,或者是什么模型。您可以共享整个代码而不是这三行吗?您可以只使用hash=hash.new[]而不是块,它将执行相同的功能。@engineersmnky这不正确。new[]生成一个哈希,对于不存在的键返回[],但不会将不存在的键的值设置为[]或任何其他值,这是此处需要的。在控制台中尝试:h=Hash.new[];h[:foo]{}@engineersmnky不过这是个好主意,也是一个常见的问题。我在写答案的时候也试过同样的方法。感谢您指出这种非常奇怪的行为,因为如果您在上面运行代码,它会完全按照您指定的方式运行,但是如果您执行h[:foo]=>[bar]。你知道这个值保存在哪里吗?因为我现在非常感兴趣。没关系,我发现它将对象存储为默认值。每次连续调用不存在的密钥时,都会将其附加到。所以h[:bar][bar,baz]。非常有趣,虽然我还不确定这是否是一个有用的例子……但现在还为时过早,所以可能是因为缺乏咖啡因+1征求意见