我将一个哈希存储到mysql中,但结果让我感到困惑:
散列:
{:unique_id=>35, :description=>nil, :title=>{"all"=>"test", "en"=>"test"}...}
我在模型中使用序列化。
serialize :title
mysql中的结果如下:
--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
all: test
en: test
任何人都能告诉我这是什么意思?为什么mysql中有ruby/hash:ActiveSupport::HashWithIndifferentAccess
?
答案 0 :(得分:2)
<强> TL; DR:强>
serialize :title, Hash
这里发生的是serialize
内部将yaml转储类实例。并且轨道中的哈希是monkeypatched可能具有无关紧要的访问权限。后者意味着您可以自由地使用字符串和相应的符号作为其键:
h = { 'a' => 42 }.with_indifferent_access
puts h[:a]
#⇒ 42
答案 1 :(得分:1)
Hash需要序列化,默认的序列化程序是YAML,它以某种方式支持,在Ruby实现中,存储类型。你的哈希是ActiveSupport :: HashWithIndifferentAccess类型的,所以当被取回时,ruby知道应该返回什么对象(将它反序列化为HashWithIndifferentAccess)。
请注意,HashWithIndifferentAccess是一个哈希,您可以使用字符串或符号访问值,因此:
tmp = { foo: 'bar' }.with_indifferent_access
tmp[:foo] # => 'bar'
tmp['foo'] # => 'bar'
使用普通哈希(Hash.new
),您将得到:
tmp = { foo: 'bar' }
tmp[:foo] # => 'bar'
tmp['foo'] # => nil
显然,在mysql中,哈希存储为一个简单的字符串,(YAML是带有约定的纯文本)