2011-11-23 26 views
7

Acabo de empezar con Ruby and Rails, y una de las cosas que realmente me gusta es las convenciones que te hace usar.¿Cómo funciona realmente el rake db :: migrate?

Quiero imitar ese comportamiento en mis propios proyectos que no son de Ruby.

Mi pregunta es ¿cómo funciona realmente? Sé que puedo ver el código de Rails, pero no estoy lo suficientemente enterado como para saber qué está pasando en él.

Sé que se necesita una secuencia de comandos de línea de base y luego ejecuta cambios de esquema de actualización en contra de ella. Pero, ¿cómo sabe en qué versión está? ¿Cómo lo imitaría en otro marco/base de datos?

+1

Busca la última migración. Corre los que vienen después de eso. * Muy * ampliamente, es una DSL para escribir SQL (SQL reversible en 3.1). ¿Puedes ser mas específico? –

+0

Funciona de muchas maneras ... ¿Qué aspecto específico de él se te escapa? –

+0

Actualizó la pregunta. Estoy hablando específicamente de migrar y desmontar (es decir, rake migrate rollback). – Dan

Respuesta

21

Nota: Esto es cierto en lo que respecta a Rails 2.x. Puede que no sea cierto para los rieles 3, ya que no he pasado tanto tiempo con Rails 3 como me hubiera gustado.

Rails crea una tabla oculta especial llamada schema_migrations. Esta tabla tiene una sola columna llamada version. Y hay una fila en esta columna para cada migración que tenga. El valor es la marca de tiempo que coincide con la marca de tiempo del nombre de archivo de migraciones.

Cuando migra, busca todas sus migraciones en orden cronológico (también sucede que es orden alfabético debido a la convención de nomenclatura basada en timstamp). Para cada migración, busca una fila coincidente en la tabla schema_migrations. Si no puede encontrar uno, ejecuta esa migración y agrega la marca de tiempo de la tabla. Si encuentra uno, asume que ya se ejecutó y simplemente lo omite.

El resultado es que 2 desarrolladores pueden realizar migraciones en cualquier orden, y está bien. Esto se debe a que Rails sabe exactamente qué migraciones se han ejecutado y cuáles no, independientemente de cuándo su base de datos las haya visto por primera vez.

Así que para hacer algo como esto, simplemente necesita una forma de almacenar permanentemente este estado sobre qué pasos se han dado y cuáles no.

+0

Esto es exactamente lo que estaba buscando. Gracias un montón. – Dan

+0

¿Cuál es la relevancia de schema.rb en este contexto? Emparejé todas las migraciones con la columna de la base de datos, ¿no sería útil para schema.rb? –

+0

Es como un archivo de Photoshop. Las migraciones son las capas y schema.rb es el resultado aplanado final de todas las capas combinadas. Entonces, si solo necesita cargar el esquema en su base de datos de prueba, puede hacerlo rápidamente en lugar de ejecutar cientos de migraciones secuencialmente para obtener el mismo resultado. –

Cuestiones relacionadas