Удалить хэш-ключ с помощью except

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

У меня есть хэш, подобный этому:

 my_hash = {
"user_attributes" => {
     "email" => "email@email.com", 
     "person_attributes" => {
           "first_name" => "a_name", 
           "last_name" => "a_name"
      }
  }
}
  

Я хочу удалить все "person_attributes" содержимое, поэтому я использовал:

 my_hash.except("person_attributes")
  

Но это ничего не дает. Как я могу удалить вспомогательный хэш-ключ?

Комментарии:

1. personal_attributes Всегда ли он будет находиться в одном и том же месте в хэше (user_attributes -> personal_attributes)?

2. Я думаю, что except — это конкретно функция rails, а не стандартная функция ruby

3. except не изменяет базовый хэш, поэтому вы либо используете except! , либо изменяете хэш самостоятельно

4. Хорошо, я удалю тег ruby, извините

5. @YoannAugen не удаляйте тег ruby, my_hash.tap { |x| x["user_attributes"].delete("person_attributes") } здесь тоже есть правильный ответ ruby

Ответ №1:

Вам нужно будет использовать это, чтобы получить my_hash['user_attrbiutes'] except person_attributes :

 2.1.0 :010 > my_hash['user_attributes'].except('person_attributes')
 => {"email"=>"email@email.com"} 
  

Чтобы получить результат в виде {"user_attributes"=>{"email"=>"email@email.com"}} , вы можете использовать:

  => {"user_attributes"=>{"email"=>"email@email.com", "person_attributes"=>{"first_name"=>"a_name", "last_name"=>"a_name"}}} 
2.1.0 :026 > my_hash['user_attributes'].delete('person_attributes')
 => {"first_name"=>"a_name", "last_name"=>"a_name"} 
2.1.0 :027 > my_hash
 => {"user_attributes"=>{"email"=>"email@email.com"}} 
  

Комментарии:

1. Я думаю, что возвращает только вспомогательный ключ user_attribute. Таким образом, вы потеряли ссылку на ключ «user_attributes», и если у вас есть другие ключи того же уровня, они тоже будут потеряны.

2. ожидаемый результат: {«user_attributes»=>{«email»=>»email@email.com «}}

3. обратитесь к изменениям 🙂

4. Хорошо, это тоже работает. Это и решение для комментариев my_hash.tap подходят для меня. Спасибо!