2012-01-23 13 views
23

Tengo lo que creo que es una migración bastante simple. Por alguna razón, recibo un error IrreversibleMigration cuando intento db:rollback o db:migrate:redo.¿Por qué esta migración es irreversible? (change_table, rename, text)

La migración se realiza sin problemas, pero prefiero mantenerla reversible. No puedo entender por qué no está escrito. ¿Algunas ideas?

Aquí está la migración:

class AddWhyHypAndWhyHypeToStatements < ActiveRecord::Migration 
    def change 
    change_table :statements do |t| 
     t.rename :description, :why_hypocritical 
     t.text :why_hypothetical 
    end 
    end 
end 

si importa, "Descripción" columna es una columna de texto. Estoy usando Rails 3.1/Ruby 1.9.2/PostgreSQL. Gracias por cualquier ayuda.

+0

¿Sabes si es el 't.rename' o' t.text' el que está causando la excepción? –

+0

No lo sé. Probé mi reversión con '--trace', pero el resultado no se refiere a ningún contenido de la migración en sí. –

+0

Intenta dividir la migración en dos partes y ver cuál plantea la excepción al deshacer. –

Respuesta

21

Parece que Rails tiene problemas para revertir el método change_table. Intenta hacerlo de esa manera en su lugar:

class AddWhyHypAndWhyHypeToStatements < ActiveRecord::Migration 
    def change 
    rename_column :statements, :description, :why_hypocritical 
    add_column :statements, :why_hypothetical, :text 
    end 
end 

Se puede ver la lista de comandos que se puede invertir en el docs o en Rails Guides.

+1

Gracias, esto parece correcto. Leí la guía y los documentos antes y pensé que dado que mi 'change_table' incluía solo un' rename' y 'add_column' sería reversible por Rails. Pero al leer la guía un poco más cerca, me doy cuenta de que es una suposición de mi parte y no necesariamente una correcta (es decir, estos comandos son solo reversibles en su forma larga, no en un nido 'change_table'). Hice este cambio, y funciona. Gracias de nuevo. –