2011-08-08 173 views
0

您好我正在從數據庫中獲取數據來創建一些圖。我回來〜6000 +條目都有一個Type, Data, Month與他們相關聯。我希望將這些全部組合到一個數據結構中,以便我可以利用不具有重複鍵的哈希性質來組合數據。紅寶石嵌套哈希創建

例如:我有輸出如..

'Component', 4.1167, 'June' 
'Component', 3.2167, 'June' 
'Component', 4.8667, 'June' 
'Component', 3.3833, 'June' 

我想打一個嵌套哈希看起來像:

{'Component' => {'June' => '15.5834'}} #where all of the data gets added 

數據又回到了我的程序爲3個平行陣列。

這樣我就可以瀏覽所有的數據,積累它,並允許散列的性質刪除我的標籤的重複。

這有可能以任何方式嗎?

感謝 獵人

回答

2

取決於你如何獲取數據從數據庫返回的,你會看一些類似的...

my_hash = {} 
a1, a2, a3 = get_database_result #whatever you call here 
a1.each_with_index do |component,i| 
    month = a3[i] 
    val = a2[i] 
    month_hash = my_hash[component] #get the month has for the component 
    if month_hash.nil? #if it doesn't exist, create it 
    month_hash = {} 
    my_hash[component] = month_hash 
    end 
    num_val = month_hash[month].nil? ? 0 : month_hash[month] #find the existing numeric value or create a zero 
    num_val += val #increment by database value 
    month_hash[month] = num_val #insert the value 
end 
my_hash #return my_hash 
+0

數據回來爲三個平行排列,感謝我給這個更新的代碼是基於3個陣列 –

+0

我這是'{'Component'=> {nil =>'value'}}'出於某種原因,本月不會出現 –

+0

我到底是什麼了,當了一槍 –

2

如果各行項目它們本身就是帶有列名稱的哈希類對象,因爲如果它們是ActiveRecord實例,那麼下面的代碼會將它們合併到所需的最終哈希中。這是一個獨立的例子。

@result = {} 
def f x 
    @result.merge!({ x[:c] => { x[:m] => x[:v] }}) do |k, o, n| 
    o.merge!(n) do |k, o, n| 
     o + n 
    end 
    end 
end 

f :c => 'Component', :v => 4.1167, :m => 'June' 
f :c => 'Component', :v => 3.2167, :m => 'June' 
f :c => 'Component', :v => 4.8667, :m => 'June' 
f :c => 'Component', :v => 3.3833, :m => 'June' 

p @result 

更新:啊哈,並行陣列?好了,你可以只改變合併來電:

f :c => components[i], :v => values[i], :m => months[i] 
+0

感謝您的想法,但我的類不從ActiveRecord繼承。我正在使用mysql命令行來生成XML文件。所以我只是解析這些,而不是做我所看到的本地ruby db調用 –

+0

,儘管它並不重要。 f(x)將採用一個散列表示一個任意組件名稱的數據的單行,並按照您的概述合併它。 – DigitalRoss