【问题标题】:Using infinite floats in Ruby on Rails在 Ruby on Rails 中使用无限浮点数
【发布时间】:2015-08-14 05:19:12
【问题描述】:

在使用 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就好了。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord sqlite


    【解决方案1】:

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

    【讨论】:

    • 不,IEEE754 明确定义了名为 +∞ 和 -∞ 的浮点值。你倒过来了,1.0/0 被定义为Float::INFINITY。将属性设置为 9e999 会导致变量设置为 Float::INFINITY,因此我得到相同的 SQLite3 错误。
    • 很抱歉。我对浮点数不太熟悉 :) 这个想法只是尝试一个非常大的数字来代替无穷大。无论如何,您是否尝试过使用Float::MAX?刚刚发现它并且知道大于这的数字在 ruby​​ 中等于无穷大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    相关资源
    最近更新 更多