Según el documento de Rails: http://guides.rubyonrails.org/migrations.html
"Active Record realiza un seguimiento de las migraciones que ya se han ejecutado, por lo que todo lo que tiene que hacer es actualizar su fuente y ejecutar rake db: migrate".
¿Cómo ActiveRecord realmente hace esto? ¿Dónde almacena Active Record los datos?
Sospecho que esto podría estar almacenado en la propia base de datos. En una mesa en alguna parte.
En mi máquina de desarrollo, ejecuté todas las migraciones. Luego copié la base de datos de producción usando mysqldump. Luego ejecuté "rake db: migrate: status", muestra correctamente las migraciones que deben ejecutarse en la base de datos de producción.
Solía pensar que ActiveRecord realiza un seguimiento de la última ejecución de migración utilizando la marca de tiempo. Pero creo que esto no es cierto porque ActiveRecord ejecuta correctamente las migraciones "antiguas" fusionadas desde otra rama de código.
¿Podría alguien con conocimiento interno de esto elaborar? Gracias
fuente
Respuestas:
Rails crea una tabla en su base de datos llamada
schema_migrations
para realizar un seguimiento de las migraciones que se han ejecutado.La tabla contiene una sola columna,
version
. Cuando Rails ejecuta una migración, toma los primeros dígitos del nombre del archivo de la migración e inserta una fila para esa "versión", lo que indica que se ha ejecutado. Si revierte esa migración, Rails eliminará la fila correspondiente deschema_migrations
.Por ejemplo, ejecutar un archivo de migración llamado
20120620193144_create_users.rb
insertará una nueva fila con una versión de20120620193144
en laschema_migrations
tabla.En cualquier momento, tiene la libertad de introducir migraciones con versiones anteriores. Rails siempre ejecutará las nuevas migraciones para las que no haya una fila correspondiente en
schema_migrations
. Los dígitos iniciales no tienen que ser una marca de tiempo, puede llamar a su migración001_blah.rb
. Las versiones anteriores de Rails usaban este formato y usaban numeración secuencial para migraciones recién generadas. Las versiones posteriores han cambiado a marcas de tiempo para ayudar a evitar que varios desarrolladores generen migraciones de forma independiente con el mismo número.fuente