2

我觉得我在这里服用疯狂的药丸。我有一个 MySQL 支持的 ActiveRecord 类,并且许多属性在 Rails 中报告为整数类型:

Device.last.score.class # returns `Fixnum`

MySQL 报告该列的类型为decimal(10,0)

我在这里想念什么?甚至尝试调用reset_column_information. 迁移看起来正确,架构文件看起来也不错。

注意:这个问题在我使用 SQLite 的开发中没有发生。

这是我的迁移:

class AddScoreColumnToDevices < ActiveRecord::Migration
    def change  
        add_column :devices, :score, :decimal
    end
end
4

1 回答 1

6

迁移为我做到了!谢谢!

新迁移的默认值为:decimaland :precision => 0:scale => 0这将导致 MySQL 十进制不接受小数点后的任何内容。

Ruby 会将这个数字(小数点后没有任何内容)视为 Fixnum,这就是您所观察到的。

因此,您需要编写一个新的迁移来更改列并给出小数精度和小数位数 > 0。

change_column :devices, :score, :decimal, :precision => 10, :scale => 10

参考:
ActiveRecord ConnectionAdapter TableDefinition #column
十进制精度和缩放
MySQL 列上的旧引用<->Ruby 数据类型映射

于 2013-09-13T16:42:51.707 回答