mxg*_*grn 7 ruby ruby-on-rails mongodb mongoid
当我将一个数组或哈希分配给一个Mongo文档的属性时,它被正确序列化,除了它们被用作哈希键时的符号.简单的例子:
irb>MyMongoModel.create :some_attr => {:a => [:b,:c]}
=> #<MyMongoModel _id: 4d861c34c865a1f06a000001, some_attr: {:a=>[:b, :c]}>
irb>MyMongoModel.last
=> #<MyMongoModel _id: 4d861c34c865a1f06a000001, some_attr: {"a"=>[:b, :c]}>
Run Code Online (Sandbox Code Playgroud)
请注意,some_attr检索的是{"a"=>[:b, :c]},而不是
{:a=>[:b, :c]}
对于嵌套的哈希(例如,在阵列或其他哈希内部)也会发生这种情况.在这种情况下有没有办法保留符号?
解
我在存储之前使用YAML手动序列化some_attr- YAML.dump(或Object#to_yaml),在读取属性后使用YAML :: load.YAML更好地保留了序列化对象.ActiveRecord正在使用YAML来实现其serialize类方法ActiveRecord::Base.
这很可能与您用来为模型提供持久层的 ORM 有关。您可能可以some_attr使用一个方法来包装它,该方法以 a 的形式返回它,HashWithIndifferentAccess然后您可以使用字符串或数组来访问它。由于您使用的是 Rails,因此可以通过调用with_indifferent_accessHash 对象上的方法来激活此功能。(如果你有一个 Hash 对象数组,当然你需要对每个对象调用它)该方法将返回相同的哈希值,但符号查找将起作用。
从你的代码:
new_hash = MyMongoModel.last.some_attr.with_indifferent_access
new_hash[:a] # Will return the same as new_hash['a']
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!