2010-08-21 3 views
23

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

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

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

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

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

Спасибо,

Дэнни

ответ

28

Не роняйте колонки, она будет очистить данные.

Однако вы можете попробовать

change_column :people, :company_id, :integer 

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

Если это не так (то есть не вся строка может быть преобразована по умолчанию), то вы можете сделать это в два этапа: 1) создать новый столбец, а затем загрузить company_id там после некоторого преобразования. 2) drop company_id затем переименуйте новый столбец.

Вы должны быть осторожны с обоими методами (более того, для второго), и вы должны, вероятно, сделать это сначала на копии базы данных, если сможете.

+0

спасибо за улучшение форматирования, jigfox – Zaki

+0

Великими, Благодарю. Я предполагаю, что мне не нужно указывать текущий тип в первом примере? – dannymcc

+2

Первый подход породил ошибки для меня, когда я нажал код на Heroku. PG :: DatatypeMismatch: ОШИБКА: столбец «company_id» не может быть автоматически применен для ввода целого числа СОВЕТ. Укажите выражение USING для выполнения преобразования. : ALTER TABLE "сотрудники" ALTER COLUMN "company_id" TYPE integer rake aborted! StandardError: произошла ошибка, эта и все последующие миграции отменены: PG :: DatatypeMismatch: ОШИБКА: столбец «company_id» не может быть автоматически добавлен для ввода целого числа СОВЕТ. Укажите выражение USING для выполнения преобразования. – Evolve

31

Не роняйте колонки, используйте этот

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

В «намек» вы получили от PostgreSQL в основном говорит вам, что вы должны подтвердить, что вы хотите, чтобы это произошло, и как данные должны быть преобразованы. Для подтверждения изменений используйте блок выше в вашей миграции

+0

Это должен быть принятый ответ – BananaNeil

8

Других ответов являются правильными, но вы можете принять один шаг вперед с :using ключевым слова:

change_column :people, :company_id, :integer, using: 'company_id::integer'