【问题标题】:Parsing recursive hashes into data records in Ruby将递归哈希解析为 Ruby 中的数据记录
【发布时间】:2023-04-03 18:53:01
【问题描述】:

我已经为这个问题苦苦挣扎了一段时间,我终于要在这里寻求帮助了。

取一个非常直接的哈希来表示某个事件:

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

我的目标是为整个散列创建一个“主记录”,记录中的字段是不包含也是散列值的所有键。当我遇到一个散列值(在本例中为“详细信息”)时,我需要为该散列中的每个 k/v 对创建一个单独的记录,该记录具有与父主记录相同的记录 ID。

我没有得到正确的递归。理想情况下,我会取回一条主记录:

{
  :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=>"dasia_schuster@wisokytrantow.com"
}

等等。我正在尝试将这组记录作为哈希数组取回。

我已经能够生成主记录和详细记录,但详细记录包含详细信息中的所有键。

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=>"hipolito_wilderman@morar.co",
  :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"}]

【问题讨论】:

  • 欢迎来到 SO。请阅读“minimal reproducible example”。您的问题很好,但您的代码不可运行,因此不会显示问题。我建议在代码中添加一个示例方法调用来演示问题。这样一来,每个试图帮助您的人都将在同一个页面上工作。

标签: ruby recursion hash


【解决方案1】:

也许你想要一些类似的东西?

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

顺便说一句,这是开始使用“spec”或“test”框架(如minitestrspec)的一个很好的例子(两者都可以用于两者)。您已经定义了输入和预期输出,并且“只”需要编写代码,直到所有测试/规范运行都是绿色的。

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2020-10-29
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多