Active Record mette a disposizione un meccanismo specifico per la creazione e l'evoluzione dello schema del database. Se guardiamo il contenuto della cartella db/migrate
della nostra applicazione di esempio, vedremo due file:
20080602001649_create_bookmarks.rb 20080602145658_acts_as_taggable_migration.rb
Questi due file sono stati generati rispettivamente dallo scaffold
utilizzato per gestione dei bookmark e dal plugin installato per aggiungere la funzionalità di tagging; il primo si è occupato di preparare la tabella per le gestione dei boomark, mentre il secondo delle tabelle per il tagging.
Se osserviamo il nome dei due file vediamo come il nome significativo dei file (create_bookmarks
per la creazione dei bookmark e acts_as_taggable_migration
per il tagging) sia preceduto da data e ora di creazione dei file. Questo semplice meccanismo consente di mantenere i file di migrazione sempre ordinati e quindi di ricostruire la "storia" dello schema del database. Nel nostro caso in un primo momento l'applicazione aveva bisogno solo della tabella per i bookmark, e in seguito di altre tabelle per il tagging.
Un'applicazione non è qualcosa di statico ma evolve durante il periodo del suo sviluppo; all'evolversi dell'applicazione evolvono i modelli che interagiscono con il database e lo schema del database. Il sistema di migrazione di Ruby on Rails è studiato per assecondare queste caratteristiche e rendere lo sviluppo di un'applicazione il più fluido possibile.
Per tenere traccia della versione del database, Rails utilizza una tabella dedicata chiamata schema_migrations
che elenca tutte le migrazioni che sono state effettuate; nel nostro caso riporterà:
SELECT * FROM schema_migrations; 20080602001649 20080602145658
Il sistema di migrazione permette di ritornare indietro nel tempo nella struttura dello schema del database; dalla versione 2 possiamo ritornare alla versione 1 e così via. Questa funzionalità torna particolarmente utile quando il codice è gestito da un SCM come Git, SVN o CVS. Poniamo il caso di avere il codice alla versione 3 e il database alla versione 2; se volessimo ritornare alla versione 1 del codice, avremmo la possibilità di trasformare lo schema del database in modo che sia allineato alla versione del codice.
I file di migrazione presenti nella cartella db/mgirate
contengono in testa al nome data e ora della loro creazione in forma di timestamp:
20080602001649_create_bookmarks.rb 20080602145658_acts_as_taggable_migration.rb
Il timestamp identifica non solo il singolo file di migrazione ma anche la versione del database che stiamo utilizzando; se al database è stato applicato solo il primo file, la versione del database sarà 20080602001649
, se è stato applicato anche il secondo sarà 20080602145658
. Dal terminale utilizziamo il comando rake db:version
per conoscere la versione del database che stiamo utilizzando:
$rake db:version Current version: 20080608125754
Il database è aggiornato all'ultima versione disponibile. Per tornare alla versione 20080602001649
, la versione in cui era presente solo la tabella per i bookmark, è sufficiente utilizzare dal terminale l'istruzione:
rake db:migrate VERSION=20080602001649
Indicando 20080608125754
come versione del database desiderata, torneremo ad avere tutte le migrazioni applicate. Se vogliamo azzerare lo schema del database, è sufficiente introdurre come versione desiderata 0
. Se non viene indicata alcuna versione, e viene quindi inserito il comando rake db:migrate
, il database verrà aggiornato all'ultima versione disponibile.