Mysql RubyonRails-如何将代码从浮点迁移到十进制?

Mysql RubyonRails-如何将代码从浮点迁移到十进制?,mysql,ruby-on-rails,ruby,Mysql,Ruby On Rails,Ruby,所以我有一个RubyonRails代码,它经常使用float(很多“to_f”)。它使用一个数据库,其中一些数字也存储为“float”类型 我想将这段代码和数据库迁移到decimal only。它是否像将数据库列迁移到十进制(添加十进制列、将浮点列复制到十进制列、删除浮点列、将十进制列重命名为旧的浮点列名)以及在代码中用“to_d”替换“to_f”这样简单?还是我需要做更多的事情 谢谢大家 Raphael您可以很容易地使用迁移来实现这一点,Rails将为您生成一些代码 在命令提示下,创建新迁移:

所以我有一个RubyonRails代码,它经常使用float(很多“to_f”)。它使用一个数据库,其中一些数字也存储为“float”类型

我想将这段代码和数据库迁移到decimal only。它是否像将数据库列迁移到十进制(添加十进制列、将浮点列复制到十进制列、删除浮点列、将十进制列重命名为旧的浮点列名)以及在代码中用“to_d”替换“to_f”这样简单?还是我需要做更多的事情

谢谢大家
Raphael

您可以很容易地使用迁移来实现这一点,Rails将为您生成一些代码

在命令提示下,创建新迁移:

rails generate migration change_price_column_to_decimal
Rails将在目录
db/migrate
中创建迁移。文件名将是一个时间戳,后跟
\u change\u price\u column\u to\u decimal.rb

在生成的迁移中,您将添加
up
down
方法来转换字段:

class ChangePriceColumnToDecimal < ActiveRecord::Migration
  def up
    change_column :products, :price, :decimal, :precision => 15, :scale => 2, null: false
  end

  def down
    # Either change the column back, or mark it as irreversible with:
    raise ActiveRecord::IrreversibleMigration
  end
end

这将为您转换数据库。请记住,当从浮点转换为十进制时,您将丢失一些有效数字,具体取决于您设置的
scale
,但如果您处理的是产品价格,这可能不是什么大问题。

请注意,
:decimal
在内部表示为一种特殊的固定精度类型,避免了使用实际浮点值所涉及的许多问题。有些数字根本不能用浮点表示,这会导致近似值和微小但明显的不精确性。“当从浮点转换为十进制时,可能会失去一些精度”。“你的意思不是相反吗?”丹尼斯:嗯,不是。如果你从十进制转换为浮点,你会获得精度,但会失去精度。如果某物的价格为1.99美元,那么存储1.99美元是准确的;但是1.989999999999375851可能更精确,但它肯定不够精确,并且会导致各种奇怪的错误。也可能是我误用了“精确”这个词。如果有人想知道为什么不使用一个
change
方法来代替
up
down
方法,那是因为。
rake db:migrate