2011-08-08 28 views
0

こんにちは私はデータベースからデータを取得してグラフを作成しています。私は戻ってきて~6000 +すべてのエントリは、それらに関連付けられているType, Data, Month持っています。私はこれらのすべてを1つのデータ構造にまとめて、重複するキーがないハッシュの性質を利用できるようにしたいと思います。 データを結合します。ruby​​ネストされたハッシュ作成

例:私は..

'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

が3つの配列I私が終わる何 –

+0

をもとにするコードを更新し、この打撃を与えます月が何も表示されない理由で '{'Component' => {nil => 'value'}}'であることを確認してください –

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から継承していません。私は、XMLファイルを生成するためにmysqlコマンドラインを使用しています。だから私はちょうどネイティブルビーdbコールを行うのではなく、それらを解析している –

+0

私は参照してください、それは本当に問題ではありません。 f(x)は任意のコンポーネント名でデータの1行を表すハッシュを取って、アウトラインのようにマージします。 – DigitalRoss

関連する問題