Rails Migration для преобразования строки в целое?
Можно ли изменить поле, в котором строка будет целочисленной, без очистки уже введенных данных?
Текущая структура db для рассматриваемой таблицы:
create_table :people do |t|
t.string :company_id
Возможно ли это с помощью миграции?
Я думаю, что, возможно, в процессе миграции произойдет удаление старого поля, создайте новый, который будет целочисленным, но я беспокоюсь, что это очистит все данные, которые уже были введены.
Спасибо,
Дэнни
Ответы
Ответ 1
Не отбрасывайте столбец, он очистит данные.
Однако вы можете попробовать
change_column :people, :company_id, :integer
и если все значения в company_id
можно преобразовать в integer
, это должно быть хорошо.
Если это не так (т.е. не вся строка может быть преобразована по умолчанию), вы можете сделать это в два этапа: 1) создать новый столбец, а затем загрузить company_id
там после некоторого преобразования. 2) отпустите company_id, а затем переименуйте новый столбец.
Вы должны быть осторожны с обоими методами (тем более для второго), и вы должны, вероятно, сделать это сначала на копии базы данных, если сможете.
Ответ 2
Не роняйте столбец, используйте
change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
"Подсказка", полученная вами от PostgreSQL, в основном говорит вам, что вам нужно подтвердить, что вы хотите, чтобы это произошло, и как данные должны быть преобразованы. Чтобы подтвердить изменения, используйте приведенный выше блок в своей миграции
Ответ 3
Другие ответы верны, но вы можете сделать еще один шаг с ключевым словом :using
:
change_column :people, :company_id, :integer, using: 'company_id::integer'