【发布时间】:2012-09-11 02:15:38
【问题描述】:
我有一个带有序列化 Hash 属性的 Rails 模型类,如下所示:
class Action
serialize :metadata, Hash
# . . .
end
该列以 YAML 编码存储在 text 列中。问题是当我将metadata 值传递给create! 方法时,哈希键会从符号转换为字符串,但其他时候不会发生这种转换。例如:
$ rails console
> a = Action.create!(:metadata => {:foo => "bar"})
> a.metadata
=> {"foo"=>"bar"}
> a.metadata[:fizz] = "buzz"
> a.metadata
=> {"foo"=>"bar", :fizz=>"buzz"}
现在当我保存模型时,数据库将具有以下文本值:
---
foo: bar
:fizz: buzz
有什么建议可以解决这个问题吗?
(这适用于 Rails 3.0.16。)
【问题讨论】:
-
它是否表现出与
serialize :metadata, HashWithIndifferentAccess相同的行为? -
@gregates:我试过了,这意味着我可以用字符串或符号查询哈希并获取值,但是有两个问题:
Action.create!(:metadata => {:foo => :bar})引发异常,因为我不是不再允许传递普通的 Hash,并且Action.find(an_old_id)引发了 SerializationTypeMismatch 异常,因为 Rails 不知道如何将 YAML 转换为 HashWithIndifferentAccess。
标签: ruby-on-rails activerecord yaml