Techioz Blog

Ruby でネストされたハッシュ要素にアクセスする

概要

このような Ruby 配列があります。

arr = [
  { "dag"=>{
      "tasks"=>[
        { "arguments"=>{
            "parameters"=>[
              { "name"=>"inputJson",
                "value"=>"{{workflow.parameters.inputJson}}"
              }
            ]
          },
          "name"=>"build-handler-workflow",
          "template"=>"build-handler-workflow"
        }
      ]
    },
    "name"=>"dag-build-handler-workflow"
  },
  { "container"=>{
      "args"=>[
        "{{inputs.parameters.inputJson}}"
      ],
      "command"=>["cowsay"],
      "image"=>"docker/whalesay:latest",
      "resources"=>{
        "requests"=>{
          "cpu"=>"100m",
          "memory"=>"100Mi"
        }
      }
    },
    "inputs"=>{
      "parameters"=>[
        {"name"=>"inputJson"}
      ]
    },
    "metadata"=>{
      "annotations"=>{
        "workflows.argoproj.io/progress"=>"0/10000"
      }
    },
    "name"=>"build-handler-workflow",
    "synchronization"=>{
      "semaphore"=>{
        "configMapKeyRef"=>{
          "key"=>"template",
          "name"=>"build-handler-config"
        }
      }
    }
  }
]

画像フィールドのみを取得するには、この配列ハッシュを反復処理するにはどうすればよいでしょうか。このようなものかもしれません

p arr['spec']['templates']['container']['image']
"image"=>"docker/whalesay:latest"

ハッシュ値にアクセスするためにマップメソッドを試してみました。有効な結果を得ることができません。

p arr.map{|e|"#{e["container"]}"}
["", "{\"args\"=>[\"{{inputs.parameters.inputJson}}\"], \"command\"=>[\"cowsay\"], \"image\"=>\"docker/whalesay:latest\", \"resources\"=>{\"requests\"=>{\"cpu\"=>\"100m\", \"memory\"=>\"100Mi\"}}}"]

解決策

これを使用することもできます。また、ハッシュをナビゲートするときに dig も非常に便利です

images = []
arr.each do |item|
  img = item.dig("container", "image")
  images << img unless img.nil?
end

p images