我以前有:
serialize :params, JSON
但这会返回 JSON 并将哈希键符号转换为字符串。我想使用符号来引用散列,这在使用散列时最常见。我喂它符号,Rails 返回字符串。为了避免这种情况,我创建了自己的 getter/setter。setter 很简单(JSON 编码),getter 是:
def params
read_attribute(:params) || JSON.parse(read_attribute(:params).to_json).with_indifferent_access
end
我无法params
直接引用,因为这会导致循环,所以我正在使用read_attribute
,现在我的哈希键可以用符号或字符串引用。但是,这不会更新哈希:
model.params.merge!(test: 'test')
puts model.params # => returns default params without merge
这让我认为哈希被副本引用。
我的问题是双重的。我可以扩展活动记录 JSON 序列化以返回无关的访问哈希(或不将符号转换为字符串),并且仍然可以像上面那样通过合并进行哈希工作吗?如果没有,我能做些什么来改进我的吸气剂,这样才能model.params.merge!
奏效?
我希望有一些类似(有效)的东西:
def params_merge!(hash)
write_attribute(:params, read_attribute(:params).merge(hash))
end
# usage: model.params_merge!(test: 'test')
更好的是,只需让 Rails 返回一个访问无关紧要的哈希,或者不将我的符号转换为字符串!感谢任何帮助。