我有一个数据库查询返回类似的结果:红宝石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
哪些工作,但是想知道是否有一个整洁的方式。
没有什么不整洁你的方法。你正在做一些操作,所以它更具可读性,因为它可以保留它,而不是试图将它塞进一行或混淆它。 – 2012-08-16 14:45:46
这取决于你用来处理到数据库的连接。我认为Sequel有能力将查询结果映射到基于特定字段的哈希散列。 – 2012-08-16 15:01:20
标准的mysql2客户端,所以没有什么花哨的。感谢更好的格式!只是想知道我是否错过了一招。 – Decado 2012-08-16 15:06:48