繁体   English   中英

红宝石/哈希:ActiveSupport :: HashWithIndifferentAccess

[英]ruby/hash:ActiveSupport::HashWithIndifferentAccess

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

TL; DR:

serialize :title, Hash

这里发生的是内部serialize将对类实例进行yaml-dump。 铁轨上的哈希值会被猴子修补,以使其访问权限无关紧要。 后者意味着您可以随意使用字符串和相应的符号作为键:

h = { 'a' => 42 }.with_indifferent_access
puts h[:a]
#⇒ 42

哈希需要序列化,默认的序列化器是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是具有约定的纯文本)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM