Rails:无法在迁移中添加:precision或:scale选项和change_column?

时间:2010-03-15 21:07:07

标签: ruby-on-rails migration decimal precision scale

之前似乎已经提到过:rails decimal precision and scale

但是,当为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"

其他人有这个问题吗?

谢谢,

约什

4 个答案:

答案 0 :(得分:34)

有一个相关(但不相同)的问题。我只是在改变比例,所以在改变:scale时你需要整行:

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

省略:decimal(已经是)和:precision(已经是10)将导致迁移失败。

答案 1 :(得分:6)

对SQLite3不起作用

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

Modify a Column's Type in sqlite3

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

感谢回复人员。

答案 2 :(得分:1)

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

rake db:schema:dump

答案 3 :(得分:0)

一个黑客,但它应该让你到达你需要去的地方:

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