D'après le document Rails: http://guides.rubyonrails.org/migrations.html
"Active Record suit les migrations déjà exécutées. Il vous suffit donc de mettre à jour votre source et d'exécuter rake db: migrate."
Comment ActiveRecord fait-il réellement cela? Où Active Record stocke-t-il les données?
Je soupçonne que cela pourrait être stocké dans la base de données elle-même? Dans une table quelque part.
Sur ma machine de développement, j'ai exécuté toutes les migrations. Ensuite, j'ai copié la base de données de production en utilisant mysqldump. Ensuite, j'ai lancé "rake db: migrate: status", il montre correctement les migrations qui doivent s'exécuter sur la base de données de production.
J'avais l'habitude de penser qu'ActiveRecord garde une trace de la dernière migration exécutée en utilisant l'horodatage. Mais je pense que ce n'est pas vrai car ActiveRecord exécute correctement les migrations «plus anciennes» fusionnées à partir d'une autre branche de code.
Quelqu'un avec une connaissance interne de cela pourrait-il élaborer? Merci
la source
Réponses:
Rails crée une table dans votre base de données appelée
schema_migrations
pour suivre les migrations exécutées.La table contient une seule colonne,
version
. Lorsque Rails exécute une migration, il prend les premiers chiffres du nom de fichier de la migration et insère une ligne pour cette «version», indiquant qu'elle a été exécutée. Si vous annulez cette migration, Rails supprimera la ligne correspondante deschema_migrations
.Par exemple, l'exécution d'un fichier de migration nommé
20120620193144_create_users.rb
insérera une nouvelle ligne avec une version de20120620193144
dans leschema_migrations
table.Vous êtes libre à tout moment d'introduire des migrations avec des versions antérieures. Rails exécutera toujours toutes les nouvelles migrations pour lesquelles il n'y a pas de ligne correspondante
schema_migrations
. Les premiers chiffres ne doivent pas nécessairement être un horodatage, vous pouvez appeler votre migration001_blah.rb
. Les versions antérieures de Rails utilisaient ce format et utilisaient une numérotation séquentielle pour les migrations nouvellement générées. Les versions ultérieures sont passées aux horodatages pour empêcher plusieurs développeurs de générer indépendamment des migrations avec le même numéro.la source