Ruby on rails 为什么型号为';s哈希字段键未另存为符号?
我在项目中使用mongoid,并且有一个具有哈希字段的模型:Ruby on rails 为什么型号为';s哈希字段键未另存为符号?,ruby-on-rails,ruby,mongoid,Ruby On Rails,Ruby,Mongoid,我在项目中使用mongoid,并且有一个具有哈希字段的模型: field :settings, type: Hash 我在创建后定义了一个回调来设置模型创建后的一些设置: after_create :set_settings def set_settings settings[:test] = true save! end 但现在我看到散列是用字符串键保存的,而不是用符号键保存的: {"test"=>true} 然后我试着像这样用符号化按键: settings[:test] = t
field :settings, type: Hash
我在创建后定义了一个回调来设置模型创建后的一些设置:
after_create :set_settings
def set_settings
settings[:test] = true
save!
end
但现在我看到散列是用字符串键保存的,而不是用符号键保存的:
{"test"=>true}
然后我试着像这样用符号化按键:
settings[:test] = true
settings.symbolize_keys!
save!
但它不起作用
关键是,如果我们在控制台中手动执行这些过程,哈希将使用符号键保存
有什么想法吗?Rails使用该类允许使用字符串或符号访问散列的键,而不考虑底层实现。我怀疑在幕后的某个地方,您的哈希正在转换为这些对象之一
至于为什么密钥被保存为字符串,我怀疑这与一个事实有关,如果你不小心的话,这个事实可以被利用来允许DOS攻击。在MongoDB中,Ruby哈希映射并序列化到BSON文档(或嵌入文档)
使用CString的(e_name)键。参考:
因此,键在序列化时被字符串化,将字符串键和符号键折叠在一起,并失去了区别。
在反序列化回Ruby哈希时,当前驱动程序映射到字符串键。
在MongoDB,Inc.Ruby驱动程序(mongo gem,github mongo Ruby驱动程序)1.8版中,
我们试图通过定义我们自己的hash来解决这个问题,
但是在内部使用符号而不是字符串。
然而,我们在JRuby的Java扩展中遇到了麻烦,不得不恢复该特性。参考:
在2.0版本中,我们计划使用新的bson ruby实现
它主要是Ruby,具有最少的C和Java扩展。
我们应该能够重新审视执行情况
有一些性能方面的考虑。
目前,由于生成新字符串,符号#to#s的成本比预期的要高。
似乎一个很好的Ruby核心语言优化就是记忆字符串。
所以序列化符号键实际上比序列化字符串键更昂贵
请随意打开一个新的Ruby票证,并请求“查询应返回一个具有不同访问权限的散列。”
它将帮助我们确定优先顺序