Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么型号为';s哈希字段键未另存为符号?_Ruby On Rails_Ruby_Mongoid - Fatal编程技术网

Ruby on rails 为什么型号为';s哈希字段键未另存为符号?

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

我在项目中使用mongoid,并且有一个具有哈希字段的模型:

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票证,并请求“查询应返回一个具有不同访问权限的散列。” 它将帮助我们确定优先顺序