Rails Migration - Измените целочисленный столбец на Array Integer - Postgres - PullRequest
1 голос
/ 25 февраля 2020

У меня есть целочисленный столбец выгоды в модели поставщика, который является столбцом перечисления.

Provider.rb

enum: ['abc', 'bcd']

Теперь я хочу перейти на array_enum

Provider.rb

array_enum: {'abc': 0, 'bcd': 1}

Итак, чтобы учесть это изменение, я хочу изменить мой столбец на массив целых чисел. В моей миграции я имею,

change_column :providers, :benefit_type, :integer, array: true, default: {}, using: "(string_to_array(benefit_type, ','))"

Ошибка:

 Caused by:
PG::UndefinedFunction: ERROR:  function string_to_array(integer, unknown) does not exist
LINE 1: ...ALTER COLUMN "benefit_type" TYPE integer[] USING (string_to_...
                                                         ^
HINT:  No function matches the given name and argument types. You might need to add explicit 
type casts.

Также попытался:

   change_column :providers, :benefit_type, :integer, array: true, default: []

Ошибка:

 Caused by:
ActiveRecord::StatementInvalid: PG::DatatypeMismatch: ERROR:  column "benefit_type" cannot 
be cast automatically to type integer[]
HINT:  You might need to specify "USING benefit_type::integer[]".
: ALTER TABLE "providers" ALTER COLUMN "benefit_type" TYPE integer[], ALTER COLUMN 
"benefit_type" SET DEFAULT '{}'

1 Ответ

1 голос
/ 25 февраля 2020

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

change_column :providers, :benefit_type, :integer, array: true, default: [], using: 'ARRAY[benefit_type]::INTEGER[]'
...