Despliegue de la database Ruby on Rails con Gerrit

Estoy considerando usar Ruby on Rails para mi próximo proyecto. Comprender el deployment de un website de Rails es bastante fácil de entender (parece que usaré Phusion Passenger )

Pero ahora estoy tratando de descubrir la database. Veo mucho sobre las "migraciones de bases de datos", que me permiten actualizar la database usando el código ruby . También veo que puedo crear una variante ascendente y descendente de estas migraciones.

Sin embargo, solo puedo comprender cómo funciona esto limpiamente en una sola dirección. Imagine si de repente digo "La columna de color no puede ser nula" . Por lo tanto, el up lo hará necesario y dará a todas las inputs NULL un valor pnetworkingeterminado. Pero, ¿qué hará el abajo ? Si le importa que sea idéntico a cómo comenzó, no puede simplemente restablecer los valores pnetworkingeterminados a NULL.

Esto realmente no importa mucho para lanzamientos a producción. Eso probablemente solo se hará en una sola dirección (en la dirección ascendente ). Sin embargo, quiero usar Gerrit para las revisiones de código, así como configurar un bot para ejecutar una compilation antes de permitir el check-in …

Entonces, ¿cómo podría funcionar eso? ¿De una revisión de código a la siguiente, el server de compilation revisará el nuevo set de códigos y ejecutará las migraciones? Pero cuando esto sucede, ni siquiera conservará el código de migration anterior, entonces, ¿cómo podría ejecutar los pasos hacia abajo ? Como un ejemplo más simple, no veo cómo podría verificar una versión anterior del código y "db migrate" hacia atrás.

Sí, no puede verificar una versión anterior del código y luego ejecutar una migration hacia abajo desde una versión más nueva del código. Debería ejecutar la migration hacia abajo antes de volver al código anterior.

Hay muchos, muchos casos en los que una migration descendente simplemente no es práctica o posible. Eso no es necesariamente algo malo. Simplemente significa que ha definido un 'punto de no retorno', donde no podrá restaurar su database a un estado anterior.

Las migraciones como crear una tabla o agregar una columna se revierten fácilmente simplemente destruyendo esa tabla o eliminando esa columna. Sin embargo, si está haciendo algo más complejo, como agregar valores pnetworkingeterminados o mover datos, puede decirle a Rails que no es posible revertir esta migration:

def down raise ActiveRecord::IrreversibleMigration end 

Recomendaría que Gerrit nunca asum nada sobre la database. Debe comenzar con una nueva database cada vez que se implemente una nueva versión, y ejecutar db:migrate para ejecutar todas sus migraciones. Puedes usar gems como factory_girl para completar tu aplicación con datos de demostración para fines de testing.