2015-05-09 5 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' построить хэш или получить доступ к переменной экземпляра? – aerook

+0

переменная экземпляра, она хранится как часть записи для моего понимания. Если это помогает, то это часть драгоценного камня 'audited'. – daveomcd

+0

Итак, '#reject!' Будет удалять только элементы из переменной экземпляра; он не будет делать никаких обновлений в базе данных. Вы вернетесь в базу данных, чтобы убедиться, что операция работала, и возвращает новый объект ruby ​​со свежими значениями из базы данных. Попробуйте удержать экземпляр игрока и сохранить его после отклонения: 'player = 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", "8А"]}