In che modo Rails tiene traccia di quali migrazioni sono state eseguite per un database?


93

Secondo Rails doc: http://guides.rubyonrails.org/migrations.html

"Active Record tiene traccia delle migrazioni già eseguite, quindi tutto ciò che devi fare è aggiornare l'origine ed eseguire rake db: migrate."

In che modo ActiveRecord lo fa effettivamente? Dove archivia i dati Active Record?

Ho il sospetto che questo possa essere memorizzato nel database stesso? In un tavolo da qualche parte.

Sulla mia macchina di sviluppo, ho eseguito tutte le migrazioni. Quindi ho copiato il database di produzione utilizzando mysqldump. Poi ho eseguito "rake db: migrate: status", mostra correttamente le migrazioni che devono essere eseguite sul database di produzione.

Pensavo che ActiveRecord tenga traccia dell'ultima migrazione eseguita utilizzando il timestamp. Ma penso che questo non sia vero perché ActiveRecord esegue correttamente le migrazioni "vecchie" unite da un altro ramo di codice.

Qualcuno con una conoscenza approfondita di questo elaborato? Grazie


1
Ha una tabella nel database che tiene traccia, credo.
Jack Franklin

Risposte:


166

Rails crea una tabella nel tuo database chiamata schema_migrationsper tenere traccia di quali migrazioni sono state eseguite.

La tabella contiene una singola colonna, version. Quando Rails esegue una migrazione, prende le cifre iniziali nel nome del file della migrazione e inserisce una riga per quella "versione", indicando che è stata eseguita. Se ripristini la migrazione, Rails eliminerà la riga corrispondente da schema_migrations.

Ad esempio, l'esecuzione di un file di migrazione denominato 20120620193144_create_users.rbinserirà una nuova riga con una versione di 20120620193144nella schema_migrationstabella.

Sei libero in qualsiasi momento di introdurre migrazioni con versioni precedenti. Rails eseguirà sempre tutte le nuove migrazioni per le quali non è presente una riga corrispondente in schema_migrations. Le cifre iniziali non devono essere un timestamp, potresti chiamare la tua migrazione 001_blah.rb. Le versioni precedenti di Rails utilizzavano questo formato e utilizzavano la numerazione sequenziale per le migrazioni appena generate. Le versioni successive sono passate ai timestamp per impedire a più sviluppatori di generare in modo indipendente migrazioni con lo stesso numero.


Particolarmente utile quando si utilizza un mix di un motore montabile e un'app fittizia
Donato
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.