2017-08-07 131 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)}