代码之家  ›  专栏  ›  技术社区  ›  Joshua Pinter

rails:无法在迁移中添加:precision或:scale选项以及change_列?

  •  18
  • Joshua Pinter  · 技术社区  · 14 年前

    这似乎是以前问过的: 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 回复  |  直到 8 年前
        1
  •  34
  •   rtfminc    13 年前

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

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

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

        2
  •  6
  •   Community CDub    7 年前

    不适用于sqlite3

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

    Modify a Column's Type in sqlite3

    我没有测试过它,但我确信这就是为什么模式没有被改变的原因,因为 change_column 不翻译为sqlite3中的任何内容。

    谢谢你们的回复。

        3
  •  1
  •   Harish Shetty    14 年前

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

    rake db:schema:dump
    
        4
  •  0
  •   Benson    14 年前

    一个黑客,但它应该能帮你找到你需要去的地方:

    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