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:
- cambiar el nombre de la columna A
- crea la nueva columna B como fecha
- mover los datos de A a B
- 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