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

Как изменить тип столбца в Heroku?

Я пытаюсь взломать db: migrations в экземпляр heorku, и я получаю сообщение об ошибке. В FAQ часто указывалась моя ошибка:

Невозможно изменить тип столбца

Пример: PGError: ОШИБКА: столбец "verified_at" не может быть введен для ввода типа "Дата"

Причина: PostgreSQL не знает, как отбросить все строки в этой таблице на указанного типа. Скорее всего, это означает у вас есть целое число или строка в этой колонке.

Решение. Осмотрите свои записи и убедитесь, что они могут быть преобразованы в Новый тип. Иногда его легче просто не используйте change_column, переименование/создание нового столбца вместо этого.

Как изменить эту миграцию сейчас. Это проблема, которая у меня есть. В моей таблице "Контакты" я создал следующее:

  t.string :date_entered

При последующей миграции я делаю следующее:

 change_column :contacts, :date_entered, :date

Этот change_column кажется проблемой.

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

Мне явно нужно изменить это значение, и оно используется во всем приложении. Спасибо.

Это то, что я пытаюсь... мысли?

def self.up
  #change_column :contacts, :date_entered, :date
  #this fails in postgres, so trying the same outcome 

  rename_column :contacts, :date_entered, :date_entered_old
  add_column :contacts, :date_entered, :date
  remove_column :contacts, :date_entered_old
end

def self.down
  add_column :contacts, :date_entered_old
  remove_column :contacts, :date_entered
  rename_column :contacts, :date_entered_old, :date_entered
end
4b9b3361

Ответ 1

Выполните следующие действия:

  • переименовать столбец A
  • создать новый столбец B в качестве даты
  • переместите данные с A на B
  • удалить A

Другими словами

def self.up
  rename_column :contacts, :date_entered, :date_entered_string
  add_column :contacts, :date_entered, :date

  Contact.reset_column_information
  Contact.find_each { |c| c.update_attribute(:date_entered, c.date_entered_string) } 
  remove_column :contacts, :date_entered_string
end

Ответ 2

Это модифицированная и проверенная версия решения Simone Carletti

class ModifyContacts < ActiveRecord::Migration
  def self.up
    rename_column :contacts, :date_entered, :date_entered_string
    add_column :contacts, :date_entered, :date

    Contact.reset_column_information
    Contact.find(:all).each { |contact| contact.update_attribute(:date_entered, contact.date_entered_string) }
    remove_column :contacts, :date_entered_string
  end
end