2017-08-07 126 views
3

我,从我的表中选择这样的所有行的方法:嵌套一个Ruby散列

smtp_status_raw = my_table.select(:message, :is_valid, :hostname).map { |h| h.values } 

这将返回数组是这样的:

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

使用以上信息,我要创建一个哈希看起来像这样:

{ 
:node_status => 
    { 
     {:hostname => "1", :message: "blah"}, 
     {:hostname => "2", :message: "blah"}, 
     {:hostname => "3", :message: "blah"} 
    } 
} 

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

其次,这是我已经试过:

# Initialize the hash 
smtp_status_hash = { :node_status: => nil } 

我与它node_status钥匙初始化smtp_status_hash哈希,但我不知道如何嵌套查询结果..

回答

5

这不是一个有效的散列,因为您有3个值,但:node_status subhash中没有键。你可以这样做:

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 
} 

获得在:node_status值作为数组:

{ 
    :node_status=>[ 
    {:message=>"blah", :hostname=>"1"}, 
    {:message=>"blah", :hostname=>"2"}, 
    {:message=>"blah", :hostname=>"3"} 
    ] 
} 

或者你可以这样做:

{ 
    node_status: smtp_status_raw.collect do |hash| 
    [hash[:hostname], hash[:message]] 
    end.to_h 
} 

它设置了分散其中key:hostnamevalue:message

{ 
    :node_status=>{ 
    "1"=>"blah", 
    "2"=>"blah", 
    "3"=>"blah" 
    } 
} 

,或者如果你有更多的键,你想保持:

{ 
    node_status: smtp_status_raw.collect do |hash| 
    [hash[:hostname], hash.reject { |key, value| key == :is_valid }] 
    end.to_h 
} 

这仍然是一个哈希其中key:hostnamevalue有另一个哈希:

{ 
    :node_status=>{ 
    "1"=>{:message=>"blah", :hostname=>"1"}, 
    "2"=>{:message=>"blah", :hostname=>"2"}, 
    "3"=>{:message=>"blah", :hostname=>"3"} 
    } 
} 

要在创建Hash之后设置密钥的值,您可以执行类似操作:

smtp_status_hash = { node_status: nil } 
smtp_status_hash[:node_status] = "Whatever you want here" 

您可以阅读关于Hash及其方法的更多信息,以及selectreject如何保留或删除哈希中的密钥。哈希虽然是字典结构,并且必须始终有一个key和一个单独的value,尽管该值可能是Array或另一个Hash

+0

非常感谢你为这个可笑的好答案! – theGreenCabbage

+0

嘿简单。你能解释一下我的问题中的“期望”散列与你例子中的第一个散列之间的区别吗?看来你把它变成了一个数组,对吧? – theGreenCabbage

+1

是的,它只是嵌套在':node_status'中的数组而不是散列。所以你想要的散列不是有效的散列的唯一原因是你有':node_status => {...}'而不是':node_status => [...]'这会告诉Ruby你想要一个每个节点的键/值对,而不仅仅是一个列表,并且只给出值(或者,只给出没有值的键) –

0

试试这个

smtp_status_hash = {:node_status=>[]}; my_table.select(:message, :is_valid, :hostname).map{ |h| h.values }.each{|i| smtp_status_hash[:node_status] << (i)}