miércoles, 2 de enero de 2013

Deshacer una migración en ruby

En ocasiones, cuando realizamos una migración en Ruby, nos damos cuenta de que nos hemos dejado algo. Un tipo de dato mal, un nombre que no es el adecuado, ...

Para deshacer el comando migrate, simplemente ejecutamos:

rake db:rollback

Y desharemos la última migración realizada.

Un detalle importante, que guarda relación con esto y que puede llevar a errores en algunos casos:

Cuando una migración tiene varias partes, como por ejemplo, cambios en varias tablas, y hay un error al realizar una de ellas, no se guardará la ejecución del comando migrate.

Por ejemplo, en una migración cambiamos primero el nombre de un campo en una tabla y en segundo lugar el tipo de dato del campo de otra tabla. Pongamos que, por error, hemos escrito mal el nombre del segundo campo: en este caso, modificaremos el nombre del campo de la primera tabla, y al realizar el cambio del tipo de dato nos dará un error, pues este campo no existe.

Lo típico será ir al fichero de migración y corregir el nombre mal escrito, para ejecutar de nuevo la migración. Nos volverá a dar error, pues el primer campo si fue modificado, y el nombre ya no coincide con el de la migración.
En este punto, no servirá un rollback!, puesto que la migración no consta como realizada. Las posibles soluciones son: modificar directamente las tablas en base de datos o bien modificar momentáneamente la migración para que no haga la primera parte.
Para prevenir esto, lo correcto sería no agrupar migraciones que se vayan a realizar en varios pasos en el mismo fichero.