ruby db结果集为哈希中的哈希中的数组

ruby db结果集为哈希中的哈希中的数组,ruby,database,hash,Ruby,Database,Hash,我有一个db查询,返回如下结果: db_result.each {|row| puts row} {"IP"=>"1.2.3.4","Field1"=>"abc","Field2"=>"123"} {"IP"=>"1.2.3.4","Field1"=>"abc","Field2"=>"234"} {"IP"=>"1.2.3.4","Field1"=>"bcd","Field2"=>"345"} {"IP"=>"3.4.5.6","Fie

我有一个db查询,返回如下结果:

db_result.each {|row| puts row}
{"IP"=>"1.2.3.4","Field1"=>"abc","Field2"=>"123"}
{"IP"=>"1.2.3.4","Field1"=>"abc","Field2"=>"234"}
{"IP"=>"1.2.3.4","Field1"=>"bcd","Field2"=>"345"}
{"IP"=>"3.4.5.6","Field1"=>"bcd","Field2"=>"456"}
{"IP"=>"3.4.5.6","Field1"=>"bcd","Field2"=>"567"}
想把它放到一个散列中,比如:

{
  "1.2.3.4" => {
    "abc" => ["123", "234"],
    "bcd" => "345"
  },
  "3.4.5.6" => {
    "bcd" => ["456", "567"]
  }
}
我目前正在做的是:

result_hash = Hash.new { |h, k| h[k] = {} }
db_result.each do |row|
  result_hash[row["IP"]] = Hash.new { |h, k| h[k] = [] } unless result_hash.has_key? row["IP"]
  result_hash[row["IP"]][row["Field1"]] <<  row["Field2"]
end 
result_hash=hash.new{h,k{h[k]={}
db|U结果。每个do|行|
结果_hash[row[“IP”]=hash.new{| h,k | h[k]=[]},除非结果_hash.hash.hash.hash.hash.hash.hash.hash.new有|键?行[“IP”]

结果\u hash[row[“IP”][row[“Field1”]]我同意Michael的观点,你的方法没有问题。代码背后的意图显而易见

如果你想变得有趣,这里有一种(多种)方法:

x = [
  {"IP"=>"1.2.3.4","Field1"=>"abc","Field2"=>"123"},
  {"IP"=>"1.2.3.4","Field1"=>"abc","Field2"=>"234"},
  {"IP"=>"1.2.3.4","Field1"=>"bcd","Field2"=>"345"},
  {"IP"=>"3.4.5.6","Field1"=>"bcd","Field2"=>"456"},
  {"IP"=>"3.4.5.6","Field1"=>"bcd","Field2"=>"567"}
]


y = x.inject({}) do |result, row|
  new_row = result[row["IP"]] ||= {}
  (new_row[row["Field1"]] ||= []) << row["Field2"]

  result
end
x=[
{“IP”=>“1.2.3.4”、“Field1”=>“abc”、“Field2”=>“123”},
{“IP”=>“1.2.3.4”、“Field1”=>“abc”、“Field2”=>“234”},
{“IP”=>“1.2.3.4”、“Field1”=>“bcd”、“Field2”=>“345”},
{“IP”=>“3.4.5.6”、“Field1”=>“bcd”、“Field2”=>“456”},
{“IP”=>“3.4.5.6”、“Field1”=>“bcd”、“Field2”=>“567”}
]
y=x.inject({})do|结果,行|
新的行=结果[行[“IP”]| |={}

(新行[row[“Field1”]| |=[])将此视为同行评审。作为处理和维护的建议

我建议您希望的数据结构更加一致

而不是:

{
  "1.2.3.4" => {
    "abc" => ["123", "234"],
    "bcd" => "345"
  },
  "3.4.5.6" => {
    "bcd" => ["456", "567"]
  }
}
我建议:

{
  "1.2.3.4" => {
    "abc" => ["123", "234"],
    "bcd" => ["345"]
  },
  "3.4.5.6" => {
    "abc" => [],
    "bcd" => ["456", "567"]
  }
}

在每个子散列中保留相同的键,并使值都是数组。处理整个散列的代码将更加简单明了。

您的方法没有任何不整洁之处。您正在执行两个操作,因此让它保持原样更具可读性,而不是试图将它塞进一行或混淆它。这取决于您使用什么来处理与数据库的连接。我认为Sequel能够将查询结果映射到基于特定字段的散列。标准mysql2客户端,因此没有什么特别之处。感谢您提供更合理的格式!我只是想知道我是否错过了一个把戏。好吧,那很酷。我想知道如何使用注入的东西。所有的值都应该是数组,这是我在复制和隐藏变量名时的错误。子关键点的数量是稍后的决策指标,因此填充不起作用。我不知道他们会事先做什么,所以无论如何做起来都很困难。