Ruby 如何从散列数组的散列中查询键值

Ruby 如何从散列数组的散列中查询键值,ruby,Ruby,我的数据库中有一个JSONB负载。此有效负载来自shopify_api的GraphQL查询 对于下面的shop_订单,我尝试在节点中查询第四个订单的名称 shop_order = {"data":{"orders":{"edges":[{"node":{"id":"gid://shopify/Order/2228134674512","name":"#1001","createdAt":"2020-05-01T18:46:04Z","shippingAddress":{"address1":"1

我的数据库中有一个JSONB负载。此有效负载来自shopify_api的GraphQL查询

对于下面的shop_订单,我尝试在节点中查询第四个订单的名称

shop_order = {"data":{"orders":{"edges":[{"node":{"id":"gid://shopify/Order/2228134674512","name":"#1001","createdAt":"2020-05-01T18:46:04Z","shippingAddress":{"address1":"1234 Long Avenue, 2N","address2":"","city":"Chicago","province":"Illinois","provinceCode":"IL","zip":"55555"}}},{"node":{"id":"gid://shopify/Order/2239643451472","name":"#1002","createdAt":"2020-05-05T14:40:36Z","shippingAddress":{"address1":"1234 Long Avenue","address2":"2N","city":"Chicago","province":"Illinois","provinceCode":"IL","zip":"55555"}}},{"node":{"id":"gid://shopify/Order/2239950323792","name":"#1003","createdAt":"2020-05-05T16:35:38Z","shippingAddress":{"address1":"1234 Long Avenue","address2":"2N","city":"Chicago","province":"Illinois","provinceCode":"IL","zip":"55555"}}},{"node":{"id":"gid://shopify/Order/2239959105616","name":"#1004","createdAt":"2020-05-05T16:38:27Z","shippingAddress":{"address1":"1234 Long Avenue","address2":"2N","city":"Chicago","province":"Illinois","provinceCode":"IL","zip":"55555"}}}]}},"casted_data":{},"errors":[]}

order = shop_order[:data][:orders][:edges][3]
puts order

response > {:node=>{:id=>"gid://shopify/Order/2239959105616", :name=>"#1004", :createdAt=>"2020-05-05T16:38:27Z", :shippingAddress=>{:address1=>"1234 Long Avenue", :address2=>"2N", :city=>"Chicago", :province=>"Illinois", :provinceCode=>"IL", :zip=>"55555"}}}

order_to_a = shop_order[:data][:orders][:edges][3].to_a
puts order_to_a

response > node
{:id=>"gid://shopify/Order/2239959105616", :name=>"#1004", :createdAt=>"2020-05-05T16:38:27Z", :shippingAddress=>{:address1=>"1234 Long Avenue", :address2=>"2N", :city=>"Chicago", :province=>"Illinois", :provinceCode=>"IL", :zip=>"55555"}}

如何从节点内的键查询和显示特定值?

您的意图并不完全清楚,但可以使用
dig
简化对散列中元素的访问:

shop_order = { 
  "data": { 
    "orders": { 
      "edges": [
        {}, {}, {}, { 
          "node": { 
            "name": '#1004', 
            "shippingAddress": { 
              "zip": '55555' 
            } 
          } 
        }
      ] 
    } 
  } 
}
使用以下方式访问数据:

order = shop_order.dig(:data, :orders, :edges)[3]
# => {:node=>{:name=>"#1004", :shippingAddress=>{:zip=>"55555"}}}
或:

如何从节点内的键查询和显示特定值

嗯?如果您想在
订单中获得信息
,请执行相同的操作:

order.dig(:node, :name) # => "#1004"
order.dig(:node, :shippingAddress, :zip) # => "55555"
或:


很多时候,当我们遍历复杂的数组散列时,我们指向变量中的数组,然后从该点开始工作。这类似于把你的手指放在食谱的一页上,所以我们可以很快回到它。我们在解析HTML/XML、解析的JSON和YAML等时也会这样做。

不清楚为什么这很困难。使用哈希的
[]
访问器执行相同的操作。为什么这是一个PostgreSQL问题?问题中的哪些内容涉及PgSQL或涉及PgSQL?SQL和Rails或Graphql也是如此。标记用于与代码或问题直接相关的内容,而不是系统的一部分。非常感谢您的解释和帮助。没问题。请注意我是如何将您的散列定义缩减到刚好足以演示问题和解决方案的。这是提问、减少代码和输入数据的重要部分。当你经常这样做的时候,它会帮助你在做的过程中发现问题。而且,这也有助于我们快速发现问题,这样您就不必等待太长时间才能找到解决方案。这是一家合作企业,你在帮助我们,绝对是。我也很欣赏你简单明了地演示了问题/解决方案。我对这些数据做了更多的工作,但这使我走上了正确的道路。这正是我们在这里所做的。这是对社区的回报,我们在过去学到的东西,并给你信息,这样你就可以在有能力的时候提前支付。
order.dig(:node, :name) # => "#1004"
order.dig(:node, :shippingAddress, :zip) # => "55555"
shop_order.dig(:data, :orders, :edges, 3, :node, :name) # => "#1004"
shop_order.dig(:data, :orders, :edges, 3, :node, :shippingAddress, :zip) # => "55555"