【发布时间】:2013-01-28 18:48:08
【问题描述】:
我以前有:
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 返回一个具有无关访问权限的哈希,或者不将我的符号转换为字符串!感谢任何帮助。
【问题讨论】:
-
model.params.merge!(test: 'test').save? -
不,我不想保存到数据库中。目前主要用于测试目的。我发现的唯一其他解决方法是
model.params = model.params.merge(test: 'test')。 -
我希望可能有一些红宝石魔法,比如我可以为参数添加的特殊方法,比如
params{}。 -
model.params[:test] = 'test'有机会吗? -
变量赋值仍然有效,正如我用
model.params = ...说明的那样,它是Hash.merge我不能直接在属性上执行,即使它返回更新的哈希值。
标签: ruby-on-rails ruby