ruby db结果集到散列中的数组

标签 ruby database hash

我有一个数据库查询,它返回如下结果:

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 

哪个有效,但是想知道是否有更简洁的方法。

最佳答案

将此视为同行评审。作为处理和维护的建议...

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

而不是:

{
  "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"]
  }
}

在每个子哈希中保留相同的键,并使值全部为数组。用于处理整个哈希的代码将更加简单且易于理解。

关于ruby db结果集到散列中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11989707/

相关文章:

c++ - 如何在 C++ 中计算对象的哈希/校验和/指纹?

ruby-on-rails - 在 ERB block 中的字符串内包含 ERB 定界符

c++ - ruby 程序 : Trailing zeros in the nth Power of a numbers factorial

mysql - LOAD DATA INFILE 不导入 CSV 数据源中的所有行

Mysql:选择所有字段都相等的行

ruby - 哈希默认值是具有相同默认值的哈希

performance - 将 MeiYan 哈希函数移植到 Go

ruby - 如何自动点击此弹出窗口中的 "Allow"按钮?

ruby - 在 Ruby 中将 [] 与安全导航运算符一起使用

mysql - 用于组合多个查询输出的存储过程