/ / Conversione della struttura del database / dati in Rails - ruby-on-rails, migration

Conversione di strutture / dati del database in Rails: ruby-on-rails, migration

Questa è una sorta di follow-up a questa domanda: È possibile utilizzare Rails Migrations per convertire i dati?

Se sto lavorando su un ramo che, quando lo ère-integrato e rilasciato alla produzione, cambierà drasticamente lo schema del database. Qual è il modo migliore per garantire che tutti i dati in produzione vengano convertiti nel nuovo formato?

Un semplice esempio potrebbe essere, c'è una colonna numerica che vogliamo modificare in testo e fare un po 'di conversione sui dati. Quindi vogliamo eliminare la vecchia colonna.

Mi è stato consigliato di non effettuare alcuna manipolazione dei dati nelle migrazioni, ma piuttosto di creare attività di rake per questo: esiste un meccanismo per garantire che le attività di rake possano essere eseguite in parallelo alle migrazioni?

In questo momento, l'unica soluzione a cui posso pensare è di farloraggruppare tutte le migrazioni che fanno cadere le colonne defunte in una seconda raccolta. Esegui la prima serie di migrazioni che aggiungono le nuove tabelle. Esegui le attività di rake, quindi esegui la seconda serie di migrazioni. Questo non mi sembra una soluzione ideale e potrebbe facilmente andare male.

risposte:

2 per risposta № 1

Le migrazioni sono esattamente per questo tipo di cose. La conversione dei dati nel database per una nuova versione dell'applicazione, con o senza una modifica dello schema, dovrebbe essere una migrazione. Questo garantisce che i nuovi cambiamenti siano fatti in produzione prima che la nuova versione dell'applicazione venga pubblicata.

Quando lavori nel ramo, crea solo unnuova migrazione, che creerà un nuovo file con timestamp. Quando si uniscono nuovamente nel ramo di rilascio, il file verrà semplicemente copiato. A causa del timestamp, le migrazioni verranno (probabilmente) eseguite nell'ordine corretto.

Se la conversione che stai facendo, comunque, continuerà ad essere eseguita di volta in volta, allora dovresti usare un'attività Rake.