【问题标题】:Rails: Cannot add :precision or :scale options with change_column in a migration?Rails:不能在迁移中使用 change_column 添加 :precision 或 :scale 选项?
【发布时间】:2011-01-27 20:58:47
【问题描述】:

这个好像以前有人问过:rails decimal precision and scale

但是当为:precision:scale 运行change_column 迁移时,它们实际上不会影响架构或数据库,但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"

其他人有这个问题吗?

谢谢,

乔什

【问题讨论】:

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


    【解决方案1】:

    不适用于 SQLite3

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

    Modify a Column's Type in sqlite3

    我尚未对其进行测试,但我确信这就是架构没有被更改的原因,因为change_column 不会转换为 SQLite3 中的任何内容。

    谢谢大家的回复。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        一个技巧,但它应该可以让你到达你需要去的地方:

        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
        

        【讨论】:

        • 好建议,但这也不起作用。我四处寻找合适的语法来改变 sqlite3 中的列类型,但发现没有办法。我确定使用 mysql 或其他数据库,我什至不会有问题。在这里发布答案。
        【解决方案4】:

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

        rake db:schema:dump
        

        【讨论】:

        • 不高兴,仍然显示相同的内容。另外,使用该应用程序表明迁移选项没有效果。
        • 我运行了相同的脚本,schema.rb 文件也相应地改变了。
        • 我又试了一次,还是没有。也许与数据库中已有的内容有关?
        猜你喜欢
        • 2018-10-31
        • 1970-01-01
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        • 2015-01-28
        • 2018-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多