У меня есть следующий хэш
{"goes_by"=>[nil, ""], "middle_name"=>[nil, ""], "suffix"=>[nil, ""], "jersey"=>["8", "8A"]}
Я пытаюсь написать заявление, чтобы отклонить любые элементы, которые имеют вложенный массив с nil & "". Поэтому я написал следующую команду, чтобы попытаться выполнить это, но она возвращает 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"]}
#audited_changes
хэш или обращается к переменной экземпляра? - person aerook   schedule 09.05.2015audited
. - person daveomcd   schedule 09.05.2015#reject!
удалит только элементы из переменной экземпляра; он не будет делать никаких обновлений в базе данных. Вы обращаетесь к базе данных, чтобы убедиться, что операция сработала, которая возвращает новый объект ruby со свежими значениями из базы данных. Попробуйте сохранить экземпляр игрока и сохранить его после отклонения:player = Player.find(286)
;player.audits.first.audited_changes.reject! { #... }
;player.audits.first.save
; - person aerook   schedule 09.05.2015{:goes_by=>[nil, ""], :middle_name=>[nil, ""], :suffix=>[nil, ""], :jersey=>["8", "8A"]}
это ваш хэш, тоhash.values.reject!{|x| x[0].nil? && x[1].empty?}
должен работать на вас - person Sonalkumar sute   schedule 09.05.2015