¿Cómo realiza Rails un seguimiento de las migraciones que se han realizado para una base de datos?

93

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

Zack Xu
fuente
1
Tiene una tabla en la base de datos que realiza un seguimiento, creo.
Jack Franklin

Respuestas:

166

Rails crea una tabla en su base de datos llamada schema_migrationspara 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 de schema_migrations.

Por ejemplo, ejecutar un archivo de migración llamado 20120620193144_create_users.rbinsertará una nueva fila con una versión de 20120620193144en la schema_migrationstabla.

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ón 001_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.

meagar
fuente
Especialmente útil cuando está utilizando una combinación de un motor montable y una aplicación ficticia
Donato