首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ruby/hash:ActiveSupport::HashWithIndifferentAccess

ruby/hash:ActiveSupport::HashWithIndifferentAccess
EN

Stack Overflow用户
提问于 2015-07-21 11:32:31
回答 2查看 1.7K关注 0票数 1

我将散列存储到mysql,但结果使我感到困惑:

散列:

代码语言:javascript
运行
复制
{:unique_id=>35, :description=>nil, :title=>{"all"=>"test", "en"=>"test"}...}

并且在我的模型中使用序列化

代码语言:javascript
运行
复制
serialize :title

mysql的结果如下:

代码语言:javascript
运行
复制
--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
all: test
en: test

有人能告诉我这是什么意思吗?为什么mysql中有一个ruby/hash:ActiveSupport::HashWithIndifferentAccess

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-21 11:41:10

TL;DR:

代码语言:javascript
运行
复制
serialize :title, Hash

这里发生的是serialize内部将yaml-转储类实例。并且rails中的散列被设置为可以有一个无动于衷的访问。后者的意思是,您可以自由地使用字符串和相应的符号作为它的键:

代码语言:javascript
运行
复制
h = { 'a' => 42 }.with_indifferent_access
puts h[:a]
#⇒ 42
票数 2
EN

Stack Overflow用户

发布于 2015-07-21 11:38:55

哈希需要序列化,默认序列化程序是YAML,它在某种程度上支持Ruby实现中的类型存储。您的散列类型为ActiveSupport::HashWithIndifferentAccess,所以当取回来时,ruby知道应该返回哪个对象(将其非序列化到HashWithIndifferentAccess)。

请注意,HashWithIndifferentAccess是一个散列,可以使用字符串或符号访问值,因此:

代码语言:javascript
运行
复制
tmp = { foo: 'bar' }.with_indifferent_access
tmp[:foo] # => 'bar'
tmp['foo'] # => 'bar'

使用普通散列(Hash.new),您可以得到:

代码语言:javascript
运行
复制
tmp = { foo: 'bar' }
tmp[:foo] # => 'bar'
tmp['foo'] # => nil

显然,在mysql中,散列存储为一个简单的字符串(YAML是带有约定的纯文本)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31537883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档