2012-08-16 110 views
2

我有一个数据库查询返回类似的结果:红宝石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 

哪些工作,但是想知道是否有一个整洁的方式。

+2

没有什么不整洁你的方法。你正在做一些操作,所以它更具可读性,因为它可以保留它,而不是试图将它塞进一行或混淆它。 – 2012-08-16 14:45:46

+0

这取决于你用来处理到数据库的连接。我认为Sequel有能力将查询结果映射到基于特定字段的哈希散列。 – 2012-08-16 15:01:20

+0

标准的mysql2客户端,所以没有什么花哨的。感谢更好的格式!只是想知道我是否错过了一招。 – Decado 2012-08-16 15:06:48

回答

1

考虑这是一个同行评议。作为处理和维护的建议...

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

相反的:

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

请各子哈希值相同的密钥,使所有值是数组。用于处理整个散列的代码将更直接并且易于遵循。

+0

所有的值都应该是数组,这是我在拷出和混淆变量名称时的拼写错误。子密钥的数量是稍后的决策制定指标,所以填充不会起作用。我不知道他们会事先做什么,所以无论如何做起来都很困难。 – Decado 2012-08-17 06:17:58

1

我同意迈克尔,你的方法没有错。代码背后的意图可以很容易地看到。

如果你想获得幻想,这里有一个方法可以做到这一点(很多):

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 

我想这应该产生相同的时间复杂度为你的方法。

+0

好的,这很酷。想知道如何使用注入的东西。 – Decado 2012-08-16 15:08:05