如何以更好的方式添加到实例变量中的现有哈希?

时间:2019-03-01 18:10:15

标签: ruby-on-rails ruby

我有一个实例变量,其哈希值是其属性之一。假设我不想使用关联。我想添加到该哈希中,目前正在以这种方式进行。

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

有没有一种方法可以做到?

2 个答案:

答案 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