www run rails que precompiling online migrations failed ruby-on-rails ruby database postgresql heroku

ruby-on-rails - que - run migrations heroku rails



¿Cómo cambio el tipo de columna en Heroku? (2)

Estoy tratando de rastrear las migraciones de db: en mi instancia heorku y me sale un error. Las preguntas frecuentes describieron mi error como a continuación:

No se puede cambiar el tipo de columna

Ejemplo: PGError: ERROR: la columna "verified_at" no se puede convertir para escribir "fecha"

Causa: PostgreSQL no sabe cómo convertir todas las filas de esa tabla al tipo especificado. Lo más probable es que signifique que tiene un número entero o una cadena en esa columna.

Solución: inspeccione sus registros y asegúrese de que se puedan convertir al nuevo tipo. A veces es más fácil evitar el uso de change_column, cambiar el nombre / crear una nueva columna en su lugar.

¿Cómo cambio esta migración ahora? Este es el problema que tengo. Para mi tabla de contactos, creé lo siguiente:

t.string :date_entered

En una migración posterior, hago lo siguiente:

change_column :contacts, :date_entered, :date

Este change_column parece ser el problema.

¿Debo ... cambiar a mano esa migración? ¿Hay alguna manera de que pueda limpiar los datos en mis tablas (no sabía que Heroku reconocería los datos en la tabla porque estoy haciendo un rastrillo).

Obviamente necesito cambiar este valor y se usa en toda mi aplicación. Gracias.

Esto es lo que estoy intentando ... ¿pensamientos?

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


Esta es una versión modificada y probada de la solución de 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


Haz lo siguiente:

  1. cambiar el nombre de la columna A
  2. crea la nueva columna B como fecha
  3. mover los datos de A a B
  4. eliminar A

En otras palabras

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