Подтвердить что ты не робот

Rails Migration для преобразования строки в целое?

Можно ли изменить поле, в котором строка будет целочисленной, без очистки уже введенных данных?

Текущая структура db для рассматриваемой таблицы:

create_table :people do |t|
t.string :company_id

Возможно ли это с помощью миграции?

Я думаю, что, возможно, в процессе миграции произойдет удаление старого поля, создайте новый, который будет целочисленным, но я беспокоюсь, что это очистит все данные, которые уже были введены.

Спасибо,

Дэнни

4b9b3361

Ответ 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'