2015-05-09 22 views
1

我有以下哈希即使條件爲真,爲什麼拒絕不在我的哈希上工作?

{"goes_by"=>[nil, ""], "middle_name"=>[nil, ""], "suffix"=>[nil, ""], "jersey"=>["8", "8A"]} 

我試圖寫一個聲明,拒絕與零&「」嵌套數組的任何元素。所以我寫了下面的命令,試圖執行這一點,但它返回nil彷彿有沒有哈希任何改變......

Player.find(286).audits.first.audited_changes.reject! {|x| x[1][0].blank? && x[1][1].blank? } 
     => nil 

但是當我打印出來的結果的條件爲真三的要素。我在這裏錯過了什麼?

Player.find(286).audits.first.audited_changes.each {|x| puts x[1][0].blank? && x[1][1].blank? } 

    true 
    true 
    true 
    false 

    => {"goes_by"=>[nil, ""], "middle_name"=>[nil, ""], "suffix"=>[nil, ""], "jersey"=>["8", "8A"]} 
+0

是否'#audited_changes'構建hash或訪問一個實例變量? – aerook

+0

實例變量,它被存儲爲我理解的記錄的一部分。如果它有助於它成爲審覈的寶石的一部分。 ! – daveomcd

+0

好了,''#reject只會刪除實例變量的元素;它不會在數據庫中做任何更新。您將重新回到數據庫中來驗證操作是否正常,從數據庫中返回一個新的ruby對象。 嘗試保持到播放器實例,並且將其保存在拒絕後: '玩家= Player.find(286)'; 'player.audits.first.audited_changes.reject! {#...}'; 'player.audits.first.save'; – aerook

回答

3

首先,當你在一個哈希調用reject!記住,你的塊都應該採取兩個參數不是一個。在你的情況的參數x總是那麼你分別哈希的關鍵:goes_by,middle_name,後綴,

所以塊應該是這樣的:

.reject! { |key, array| array.all? { |array_item| array_item.blank? } }

+0

工作如果'#reject!'被調用,採用單個參數的塊,每個鍵/值對產生作爲2元件陣列。 – aerook

+0

這工作很好,並改善了我的醜陋的代碼,謝謝! – daveomcd

1

請記住,您正在使用reject!用哈希

{ "goes_by"=>[nil, ""], 
    "middle_name"=>[nil, ""], 
    "suffix"=>[nil, ""], 
    "jersey"=>["8", "8A"] 
}.reject! {|key, value| value.all?(&:blank?) }] 

這將返回=> { 「球衣」=> [ 「8」, 「8A」]}

相關問題