Rails: изменить тип столбца, но сохранить данные - PullRequest
24 голосов
/ 02 марта 2012

У меня есть модель со столбцом типа integer, которую я хочу преобразовать в тип string.Сейчас я ищу лучший способ изменить тип столбца без потери данных .Есть ли безболезненный способ сделать это?

Ответы [ 6 ]

36 голосов
/ 02 марта 2012

Стандартная миграция с использованием метода 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
4 голосов
/ 03 марта 2015

для postgres в миграции

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

и для любого допустимого типа, аналогичного

2 голосов
/ 07 декабря 2017

для postgresql , изменить тип данных столбца таблицы integer на string,
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
2 голосов
/ 02 марта 2012

Если это одноразовый файл, вы можете просто изменить тип столбца в базе данных (поскольку информация не теряется при переходе от int к varchar)

Для MySQL это будет сделано:

ALTER TABLE t1 MODIFY col1 VARCHAR(256)

Если вы используете SQLite, вам не нужно ничего делать.

1 голос
/ 09 мая 2018

Вы можете попробовать что-то вроде этого:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

или даже лучше:

change_column :table_name, :column_name, :integer, using: 'column_name::integer'

Подробнее об этой теме вы можете прочитать здесь: https://kolosek.com/rails-change-database-column

1 голос
/ 26 августа 2016

Если вы используете Postgres, вы не можете неявно преобразовать строку обратно в целое число, поэтому способ сделать изменение обратимым:

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

  def self.down
    add_column :age_integer
    User.connection.execute('UPDATE users SET age_integer = cast(age as int)')
    remove_column :users, :age
    rename_column :users, :age_integer, :age
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...