Rails:更改列类型,但保留数据

bli*_*ini 25 model ruby-on-rails

我有一个类型列的模型integer,我想转换为类型string.现在我正在寻找更改列类型而不丢失数据的最佳方法.有没有一种无痛的方法来实现这一目标?

Jon*_*Jon 37

使用change_column方法的标准迁移将整数转换为字符串而不会丢失任何数据.如果需要,rake db:rollback也会执行反向迁移而不会出错.

以下是我用于确认此行为的测试迁移:

class ChangeAgeToString < ActiveRecord::Migration
  def self.up
    change_column :users, :age, :string
  end

  def self.down
    change_column :users, :age, :integer
  end
end
Run Code Online (Sandbox Code Playgroud)


Ден*_*кин 5

对于迁移中的 postgres

 change_column :table_name, :field,'boolean USING (CASE field WHEN \'your any string as true\' THEN \'t\'::boolean ELSE \'f\'::boolean END)'
Run Code Online (Sandbox Code Playgroud)

和任何类似的有效类型


Sha*_*jed 5

对于postgresql,将表列数据类型更改integerstring
rails migration like this with up and down actions

class ChangeAgeToString < ActiveRecord::Migration
  def self.up  
    change_column :users, :age, 'varchar USING CAST(age AS varchar)', null: false
  end

  def self.down
    change_column :users, :age, 'integer USING CAST(age AS integer)', null: false, default: 0
  end
end
Run Code Online (Sandbox Code Playgroud)