红宝石/哈希:的ActiveSupport :: HashWithIndifferentAccess

时间:2015-07-21 11:32:32

标签: mysql ruby-on-rails ruby

我将一个哈希存储到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

2 个答案:

答案 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是带有约定的纯文本)