我有一个如下列表
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
在迭代文本文件的循环内部。其中“models”是模型列表的数组。 这里的问题是哈希看起来像这样:
{
: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"]
}
我理解为什么会这样,但我不明白如何获得所需的哈希值。
答案 0 :(得分:2)
我在此假设parsed_line
是一个如下所示的数组:[ "001", "Model A" ]
。我不知道models
是什么,但我认为这是不必要的。这样的事情应该有效:
parsed_lines = [ [ "001", "Model A" ],
[ "002", "Model B" ],
# ...
]
hash = {}
parsed_lines.each do |id, model|
hash[id] ||= []
hash[id] << model
end
或者,更简单地说(使用Hash.new
方便的默认阻止):
hash = Hash.new {|hash, id| hash[id] = [] } # If `hash[id]` isn't yet set when
# we try to access it, automatically
# initialize it with an empty array
parsed_lines.each do |id, model|
hash[id] << model
end
答案 1 :(得分:0)
我猜你没有任何数据库。如果您拥有的只是一个二维数组并且您想将其转换为哈希值,那么这就是您应该做的事情
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
答案 2 :(得分:0)
这个班轮怎么样(没有声明parsed_lines
)
parsed_lines = [
["001", "Model A"],
["001", "Model B"],
["001", "Model C"],
["002", "Model A"],
["002", "Model B"],
["002", "Model D"]
]
Hash[parsed_lines.group_by(&:first).map{|k,v| [k.to_sym,v.map(&:last)]}]
#=> {:"001"=>["Model A", "Model B", "Model C"], :"002"=>["Model A", "Model B", "Model D"]}
但最好是做@ArupRakshit所说的并使用group_by
查询并跳过这个额外的处理步骤。