嵌套哈希的Ruby路径

嵌套哈希的Ruby路径,ruby,hash,Ruby,Hash,我有一个散列,@data看起来类似于以下内容: { "calcData" => { "coverStartDate" =>"10/08/2011", ... "part"=> [ { "licenceYears" =>"10", "licenceType" =>"1",

我有一个散列,
@data
看起来类似于以下内容:

{
   "calcData"   =>   {
      "coverStartDate"      =>"10/08/2011",
      ...
      "part"=>      [
         {
            "licenceYears"            =>"10",
            "licenceType"            =>"1",

            ...

            "@partname"            =>"ratingData"
         },
         {                
            "dob"            =>"26/01/1964",
            "age"            =>"47",

            ...

            "@partname"            =>"driver"
         },

         ...
      ]
   }
}
部分
位中有更多不同的部分@partnames

选择这些
@partname
位的最佳方式是什么:

e、 g:

@data[“calcData”][“part>”][“LicenseYears”]
如何在ruby/rails中表示这种逻辑?

这里有一种方法:

part = @data["calcData"]["part"]
keys = part.keys.select{|key| part["@partname"] == "ratingData"}
values = keys.collect{|key| part[key]["licenceYears"]}
您可以将其组合成一行,但它不容易阅读。

使用Struct

CalcData = Struct.new :coverStarDate, :part
calc_data = CalcData[ "10/08/2011",
                      { "licenceYears" => 10,
                        # etc.
                      } ]
这样,你就摆脱了顶层括号的引用,你可以说:

calc_data.part["licenceYears"]

-1您的数据不是有效的Ruby对象。您有一个额外的数组开始
[
和一个额外的散列结束
}
。此外,相关的键应该是
“part”
,而不是
“part”
,正如您在“例如”中暗示的那样@sawa我已经在很大程度上修改了实际的散列。这些只是一个打字错误——我更感兴趣的是如何解决这个问题——我编辑了这篇文章,使其有效。
calc_data.part["licenceYears"]
query = 'driver'

@data["calcData"]['part'].select{|part| part['@partname'].eql?query}
 => [{"dob"=>"26/01/1964", "age"=>"47", "@partname"=>"driver"}]