我有一个 ActiveRecord 模型,它使用 ActiveRecordstore
功能将文本字段转换为哈希,以提供类似记录伪 noSQL 的行为(忽略我没有使用该accessors
选项的事实):
class Book < ActiveRecord::Base
store :infodump
end
book = Book.new
book.infodump[:color] = green
puts book.infodump[:color]
# => green
这工作得很好,但我希望infodump
被视为 Hashie::Mash 对象,以便我可以这样做:
book = Book.new
book.infodump.author_info = {name: 'Bob', location: {city: 'Manhattan', state: 'NY'}}
puts book.infodump.author_info.location.state
# => NY
如果您不熟悉 Hashie gem,它允许您为 Hash 提供有用的功能......在这种情况下,将哈希密钥存储视为具有点可访问属性的对象:https:// github.com/intridea/hashie
Mash 对象尤其会自动赋予这些便利,即使是嵌套哈希,这就是为什么我希望我的infodump
商店被视为 Hashie::Mash 对象。
那么如何将该属性初始化为 Hashie::Mash?我开始做一个before_initialize
回调来做这样的事情:
def make_mash
infodump = Hashie::Mash.new(infodump)
end
但是每次实例化对象时都会运行......我只需要在对象的生命周期中完成一次对象转换。