在Ruby on Rails中使用无限浮点数

7
在一个使用SQLite3的Rails应用程序中,我想在具有浮点属性的模型中使用浮点值Float :: INFINITY- Float :: INFINITY。使用Model.create!运行INSERT查询时,这似乎可以正常工作,因为在这种情况下activerecord使用预处理语句。但是,当我尝试使用foo.save更新记录时,activerecord不使用预处理语句,而是直接将字符串 Infinity 放入查询中,导致以下结果:
SQLite3::SQLException: no such column: Infinity

有没有办法解决这个问题,还是我需要在模型/数据库中使用字符串?Rails版本为3.2.21,SQLite3版本为1.3.10。编辑:目前我已经在数据库迁移中将列类型更改为“string”并使用。
serialize :property, Float

为了让ActiveRecord能够将YAML序列化的浮点数存储在数据库中,可以顺利地存储Float::INFINITY

1个回答

2

这是因为在rails中,Float::INFINITY被定义为1.0/0,所以sqlite3不知道该怎么处理。你可以使用一个非常大的数字9e999作为将要保存到数据库的值的替代值来定义无穷大。


1
不,IEEE754 明确定义了名为+∞和−∞的浮点值。你搞反了,1.0/0 被定义为 Float::INFINITY。将属性设置为 9e999 会导致变量被设置为 Float::INFINITY,因此我得到了相同的 SQLite3 错误。 - Christoph
1
抱歉,我对浮点数不是很熟悉 :) 思路只是尝试使用一个非常大的数字来替代无穷大。不管怎样,你尝试过使用 Float::MAX 吗?我刚刚发现这个方法,知道在 Ruby 中比这个数字更大的数字都等于无穷大。 - Jason Adrian Bargas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接