Как лучше добавить существующий хеш в переменную экземпляра? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть переменная экземпляра с хэшем в качестве одного из его свойств.Предположим, что я не хочу использовать ассоциации.Я хочу добавить к этому хешу, и в настоящее время я делаю это следующим образом.

# dog.owners = { "Brad": "bar", "Matt": "foo"}
hash = dog.owners
hash["David"] = "foose"
dog.update(owners: hash)

Есть ли способ сделать это в одной строке?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

dog.update owners: dog.owners.merge( David: "foose" )

Обновление

Обратите внимание, что комментарий в вашем вопросе показывает, что хеш-ключи символов , т.е.в { "Brad": "bar" } наличие : сделает "Brad" в символе :Brad в полученном хэше.

Это важно, потому что позже в вашем вопросе вы увидите hash["David"] = "foose" - это добавлениеновый элемент хэша с строкой ключом "David"!

Это важно, потому что "David" != :David так, например:

[11] pry(main)> x = { "David": "symbol" }
=> {:David=>"symbol"}
[12] pry(main)> x["David"] = "string"
=> "string"
[13] pry(main)> x               
=> {:David=>"symbol", "David"=>"string"}

Так что будьте осторожнытам.

Второе обновление:)

Все это, как говорится, если это поле только выходит из поля JSON (B) из БД или чего-то еще, тогда фактически все ваши ключи могут быть строками, в этом случае вы должны показать свой хеш с =>, а не : (но, возможно, вы показывали необработанный JSON).

0 голосов
/ 01 марта 2019

Посмотрите на использование serialize .Это позволяет ActiveRecord быть немного умнее в работе с объектами.

class Dog < ApplicationRecord
    serialize :owners
end

...

dog = Dog.first
dog.owners["David"] = "foose"
dog.changes
dog.save
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...