2016-04-25 12 views
1

私はこの問題をしばらく苦労しています。私はついにここで助けを求めるつもりです。Rubyのデータレコードに再帰的ハッシュを解析する

いくつかのイベントを表し、非常に簡単ハッシュください:私の目標は、レコードのフィールドが含まれていないすべてのキーであることで、全体のハッシュのための「マスターレコード」を作成することです

{ 
    :eventkey=>"someeventkey", 
    :web_id=>"77d5f434-5a40-4582-88e8-9667b7774c7d", 
    :apikey=>"eaf3b6e1-b020-41b6-b67f-98f1cc0a9590", 
    :details=> { 
    :phone=>"1-936-774-6886", 
    :email=>"[email protected]", 
    :pageUrl=>"http://ortiz.info/joe" 
    } 
} 

を値もハッシュです。ハッシュ(この場合は「詳細」)の値を入力すると、親マスターレコードと同じレコードIDを持つそのハッシュの各k/vペアごとに個別のレコードを作成する必要があります。

何とか再帰を取得できません。

{ 
    :recordid=>"some-generated-record-id", 
    :web_id=>"77d5f434-5a40-4582-88e8-9667b7774c7d", 
    :apikey=>"eaf3b6e1-b020-41b6-b67f-98f1cc0a9590", 
    :details=>nil 
} 

とネストされたハッシュ内の各キーの個別のエントリ:

{ 
    :recordid=>"some-generated-detail-record-id", 
    :parentid=>"the-parent-id-from-the-master-record", 
    :phone=>"1-936-774-6886" 
} 

{ 
    :recordid=>"another-generated-detail-record-id", 
    :parentid=>"the-same-parent-id-from-the-master-record", 
    :email=>"[email protected]" 
} 

そしてそうに理想的には私は、単一のプライマリレコードを取り戻すでしょう。私はこの一連のレコードをハッシュの配列として戻そうとしています。

マスターレコードと詳細レコードを生成できるようになっていますが、詳細レコードにはすべてのキーが詳細に含まれています。

def eventToBreakout(eventhash,sequenceid = -1, parentrecordid = nil, records = []) 
    recordid = SecureRandom.uuid 
    sequenceid += 1 

    recordstruc = {:record_id => recordid, :parent_record_id => parentrecordid, :record_processed_ts => Time.now, :sequence_id => sequenceid} 
    eventhash.each_pair do |k,v| 
     if recurse?(v) 

      eventToBreakout(v,sequenceid,recordid,records) 

     else 
      if !recordstruc.keys.include?(k) 
      recordstruc[k]=v 
      end 
     end 

    end 
    records << recordstruc 
    records 
end 

私のコードはここに含まれていますが、私は現在そのコードから取得しています。

[{:record_id=>"ed98be89-4c1f-496e-beb4-ede5f38dd549", 
    :parent_record_id=>"fa77299b-95b0-429d-ad8a-f5d365f2f357", 
    :record_processed_ts=>2016-04-25 16:46:10 -0500, 
    :sequence_id=>1, 
    :phone=>"1-756-608-8114", 
    :email=>"[email protected]", 
    :pageUrl=>"http://haag.net/alexie.marvin"}, 
{:record_id=>"fa77299b-95b0-429d-ad8a-f5d365f2f357", 
    :parent_record_id=>nil, 
    :record_processed_ts=>2016-04-25 16:46:10 -0500, 
    :sequence_id=>0, 
    :eventts=>2016-04-25 22:10:32 -0500, 
    :web_id=>"a61c57ae-3a01-4994-8803-8d8292df3338", 
    :apikey=>"9adbc7a4-03ff-4fcc-ac81-ae8d0ee01ef0"}] 
+0

ようこそ。 「[mcve]」をお読みください。あなたの質問は良いですが、あなたのコードは実行可能ではないので、問題が示されません。問題を示すためにサンプルメソッド呼び出しをコードに追加することをお勧めします。そうすれば、皆さんを助けようとしている人はすべて同じページから作業するでしょう。 –

答えて

0

多分あなたはこれらの行に沿って何かをしたいですか?ところで

input = { id: 'parent', value: 'parent value', child: { child_value: 1}} 

record = {} 
input.each do |k,v| 
    if v.is_a? Hash 
    v[:parent_id] = input[:id] 
    (record[:children] ||= []) << v 
    else 
    record[k] = v 
    end 
end 

puts record 
# {:id=>"parent", :value=>"parent value", :children=>[{:child_value=>1, :parent_id=>"parent"}]} 

これはminitestまたはrspecのような「spec」または「test」フレームワーク(両方とも両方に使用することができます)を使い始めるのに良い例です。あなたはすでに入力と期待出力を定義しており、すべてのテスト/スペックランが緑色になるまで「ちょうど」コードを書く必要があります。

関連する問題