2013-07-02 56 views
0

我有一個使用ActiveRecord的store功能,可以將一個文本框到一個哈希,給記錄僞NOSQL樣的行爲ActiveRecord模型(忽略我不是使用accessors選項的事實):如何初始化ActiveRecord的序列化對象/存儲的對象類型?

class Book < ActiveRecord::Base 
    store :infodump 
end 

book = Book.new 
book.infodump[:color] = green 
puts book.infodump[:color] 
# => green 

這工作得很好就夠了,但我想infodump被視爲HASHIE ::醪對象,以便我可以這樣做:

book = Book.new 
book.infodump.author_info = {name: 'Bob', location: {city: 'Manhattan', state: 'NY'}} 
puts book.infodump.author_info.location.state 
# => NY 

如果你不熟悉HASHIE寶石,它允許你將有用的特性提供給哈希......在這種情況下,將哈希密鑰存儲視爲一樣它是一個具有點可訪問屬性的對象:https://github.com/intridea/hashie

即使在嵌套散列時,Mash對象也會自動提供這些便利,這就是爲什麼我希望我的infodump存儲被視爲Hashie :: Mash對象。

那麼如何初始化該屬性爲Hashie :: Mash?我開始做一個before_initialize回調做這樣的事情:

def make_mash 
    infodump = Hashie::Mash.new(infodump) 
end 

但隨後在每週的對象實例化時......我只需要在對象的生命週期做一次這個對象轉換。

回答

1

在我的模型使用serialize其允許傳遞型序列化到/從

serialize :infodump, Array 

該方法序列化對象YAML所以Hashie::Mash需要具有實現各方法。