嵌套Ruby哈希

the*_*age 3 ruby hash sequel

我有一个方法,从我的表中选择所有行,如下所示:

smtp_status_raw = my_table.select(:message, :is_valid, :hostname).map { |h| h.values }
Run Code Online (Sandbox Code Playgroud)

这将返回一个如下所示的数组:

[{:message=>"blah", :is_valid=>true, :hostname=>"1"}, {:message=>"blah", :is_valid=>true, :hostname=>"2"}, {:message=>"blah", :is_valid=>true, :hostname=>"3}]
Run Code Online (Sandbox Code Playgroud)

使用上面的信息,我想创建一个如下所示的哈希:

{ 
:node_status => 
    {
        {:hostname => "1", :message: "blah"},
        {:hostname => "2", :message: "blah"},
        {:hostname => "3", :message: "blah"}
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,我的问题 - 是否有可能像上面那样创建一个哈希?在上面的示例Sequel查询中,我有三个对象,它们是三个独立的主机,我想将这三个主机添加到一个:node_status密钥中.那可能吗?如果那不是有效的哈希,那么另一种选择是什么呢?

其次,这是我尝试过的:

# Initialize the hash
smtp_status_hash = { :node_status: => nil }
Run Code Online (Sandbox Code Playgroud)

smtp_status_hashnode_status它中的一个键初始化了哈希,但我不确定如何嵌套查询结果.

Sim*_*ime 5

这不是一个有效的哈希,因为你有3个值,但:node_statussubhash中没有键.你可以这样做:

smtp_status_raw = [
  {:message=>"blah", :is_valid=>true, :hostname=>"1"},
  {:message=>"blah", :is_valid=>true, :hostname=>"2"},
  {:message=>"blah", :is_valid=>true, :hostname=>"3"}
]

{
  node_status: smtp_status_raw.collect do |hash|
    hash.reject { |key, value| key == :is_valid }
  end
}
Run Code Online (Sandbox Code Playgroud)

:node_status数组形式获取值:

{
  :node_status=>[
    {:message=>"blah", :hostname=>"1"},
    {:message=>"blah", :hostname=>"2"},
    {:message=>"blah", :hostname=>"3"}
  ]
}
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做:

{
  node_status: smtp_status_raw.collect do |hash|
    [hash[:hostname], hash[:message]]
  end.to_h
}
Run Code Online (Sandbox Code Playgroud)

其中规定了与子哈希key作为:hostnamevalue福利:message:

{
  :node_status=>{
    "1"=>"blah",
    "2"=>"blah",
    "3"=>"blah"
  }
}
Run Code Online (Sandbox Code Playgroud)

或者如果你想要保留更多的钥匙:

{
  node_status: smtp_status_raw.collect do |hash|
    [hash[:hostname], hash.reject { |key, value| key == :is_valid }]
  end.to_h
}
Run Code Online (Sandbox Code Playgroud)

这仍然是一个散列结果,其中的key:hostname,但value有另一个哈希:

{
  :node_status=>{
    "1"=>{:message=>"blah", :hostname=>"1"},
    "2"=>{:message=>"blah", :hostname=>"2"},
    "3"=>{:message=>"blah", :hostname=>"3"}
  }
}
Run Code Online (Sandbox Code Playgroud)

Hash在创建密钥后设置密钥值,您可以执行以下操作:

smtp_status_hash = { node_status:  nil }
smtp_status_hash[:node_status] = "Whatever you want here"
Run Code Online (Sandbox Code Playgroud)

您可以阅读更多有关Hash它及其方法的信息,以及如何select以及reject保持或删除哈希中的键.哈希虽然是字典结构,但必须始终具有一个key和一个value,但该值可能是一个Array或另一个Hash.