之前好像有人问过这个问题: Rails 小数精度和小数位数

但是当运行 change_column 迁移为 :precision 或者 :scale 它们实际上并不影响模式或数据库,但是 db:migrate 运行没有错误。

我的迁移文件如下所示:

class ChangePrecisionAndScaleOfPaybackPeriodInTags < ActiveRecord::Migration
  def self.up
    change_column :tags, :payback_period, :decimal, { :scale => 3, :precision => 10 }
  end

  def self.down
    change_column :tags, :payback_period, :decimal
  end
end

但我的架构(和数据)仍然是:

t.decimal  "payback_period"

还有其他人有这个问题吗?

谢谢,

乔什

有帮助吗?

解决方案 2

不适用于 SQLite3

对于我正在运行的这个简单的测试应用程序,我有 SQLite3 设置。显然, SQLite3 不依赖列类型声明 并且更加动态,而是查看专栏的内容 - 正如在这里偶然发现的:

修改sqlite3中的列类型

我还没有测试过它,但我确信这就是架构没有被更改的原因,因为 change_column 不会转换为 SQLite3 中的任何内容。

谢谢你们的回复。

其他提示

有一个相关的(但不相同)的问题。我只是在不断变化的规模,所以改变的时候:规模需要完整行:

change_column :something, :weight, :decimal, :precision => 10, :scale => 2

遗漏:十进制(它已经是)和:精度(其已是10)将导致迁移失败

删除和重新生成db\schema.rb文件。

rake db:schema:dump

有一个黑客,但它应该在哪里,你需要去得到你:

class ChangePrecisionAndScaleOfPaybackPeriodInTags < ActiveRecord::Migration
  def self.up
    execute "ALTER TABLE tags CHANGE payback_period DECIMAL(3,10)"
  end

  def self.down
    change_column :tags, :payback_period, :decimal
  end
end
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top