2012-08-16 111 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