Измените тип столбца с текстового на массив строк (PG :: DatatypeMismatch: ERROR: column) - PullRequest
0 голосов
/ 06 августа 2020

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

class ChangeEmailsAndPhonesToArrayOfString < ActiveRecord::Migration[6.0]
  def up
    change_table :hotels do |t|
      t.change :emails, :string, array: true, default: []
      t.change :phones, :string, array: true, default: []
    end
  end

  def down
    change_table :hotels do |t|
      t.change :emails, :text
      t.change :phones, :text
    end
  end
end

Но я получаю эту ошибку при запуске rails db: migrate

PG :: DatatypeMismatch: ОШИБКА: столбец «электронные письма» не может быть автоматически приведен к типу изменяющихся символов [] СОВЕТ: вам может потребоваться указать «ИСПОЛЬЗОВАНИЕ электронных писем :: изменяющиеся символы []».

Как исправить проблему?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Согласно этой ссылке у меня работает следующий код

def up
  change_table :hotels do |t|
    t.change :emails, :string, array: true, default: [], using: "(string_to_array(emails, ','))"
    t.change :phones, :string, array: true, default: [], using: "(string_to_array(phones, ','))"
  end
end
0 голосов
/ 06 августа 2020

Как указано в тексте ошибки, вы должны указать приведение, чтобы изменить этот тип данных при миграции.

Вы можете использовать его, как показано ниже:

class ChangeEmailsAndPhonesToArrayOfString < ActiveRecord::Migration
  def up
    change_table :hotels do |t|
      t.change :emails, 'text ARRAY USING emails::character varying[]', default: []
      t.change :phones, 'text ARRAY USING phones::character varying[]', default: []
    end
  end

  def down
    change_table :hotels do |t|
      t.change :emails, :text
      t.change :phones, :text
    end
  end
end

В примере выше мы указываем явное приведение к типу text[] для данных полей.

Однако вам может потребоваться явно преобразовать ваши данные, если они есть, в вашей таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...