2015-07-21 72 views
0

我哈希存儲到MySQL,但結果讓我迷惑:紅寶石/哈希:的ActiveSupport :: HashWithIndifferentAccess

哈希:

{: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

'Sidenote':以JSON存儲爲JSON應該使用PostgreSQL,MySQL的不RDBMS。 – mudasobwa

回答

2

TL; DR:

serialize :title, Hash 

這裏發生的事情是,serialize內部將YAML轉儲類的實例。而鐵軌中的哈希值可能會被忽視。後者意味着,您可以自由使用字符串和相應的符號,因爲它的鍵:

h = { 'a' => 42 }.with_indifferent_access 
puts h[:a] 
#⇒ 42 
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是帶有約定的純文本)