我有一个实例变量,其哈希值是其属性之一。假设我不想使用关联。我想添加到该哈希中,目前正在以这种方式进行。
# dog.owners = { "Brad": "bar", "Matt": "foo"}
hash = dog.owners
hash["David"] = "foose"
dog.update(owners: hash)
有没有一种方法可以做到?
答案 0 :(得分:1)
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)。
答案 1 :(得分:0)
请使用serialize。这使ActiveRecord在处理对象方面更加聪明。
class Dog < ApplicationRecord
serialize :owners
end
...
dog = Dog.first
dog.owners["David"] = "foose"
dog.changes
dog.save