7

Mi sono imbattuto in un problema in cui stavo lavorando su due rami su un progetto di rotaie e ogni progetto ha una migrazione per aggiungere una colonna. Al momento, rake db:migrate:reset causa un problema e mi sono basato esclusivamente sul mio schema.rb per rappresentare correttamente lo stato del mio database. A un certo punto, mi sono imbattuto in un problema in cui una colonna aggiunta dal ramo A è entrata nello schema del ramo B. Poiché migrate:reset non era un'opzione, ho fatto ricorso alla modifica manuale del file dello schema. Ho commesso questa modifica che in pratica eliminava la colonna dal ramo A di cui non avevo bisogno nello schema.rb del ramo B.È considerato sicuro modificare manualmente schema.rb in rotaie

Il problema è arrivato dopo aver unito il ramo A al master. Quando ho provato a rebase il ramo B per master, ho ancora avuto commit in B per eliminare la colonna (che ora è diventata rilevante perché è in master) nel file dello schema. Git non ha visto un conflitto per questo e lo ha integrato automaticamente. Alla fine della mia rebase, ho scoperto che il mio schema è incoerente con quello che ho nel master.

La mia correzione è di modificare nuovamente il file dello schema e di aggiungere manualmente la colonna eliminata in precedenza al file dello schema. La mia domanda è: è considerato non convenzionale? pericoloso? hacky?

In questo momento si tratta di una colonna, ma se questo comportava più eliminazioni/aggiunte di colonne, la soluzione (pericolosa?) Poteva portare a più problemi e incoerenza db/schema.rb.

risposta

6

Generalmente è considerata una cattiva pratica modificare il file schema.rb.

Secondo il Rails Guide on Migrations:

migrazioni, potente in quanto potrebbero essere, non sono la fonte autorevole per lo schema del database. Tale ruolo ricade su db/schema.rb o su un file SQL che Active Record genera esaminando il database. Non sono progettati per essere modificati, rappresentano solo lo stato corrente del database.

schema.rb viene aggiornato ogni volta che si esegue una nuova migrazione:

nota che l'esecuzione del db: migrate anche invoca il db: compito discarica, che aggiornerà il vostro db/schema: schema. file rb per abbinare la struttura del tuo database.

Si consiglia di passare un po 'di tempo per sistemare le cose e ottenere il file schema.rb di nuovo in pista e correggere fino all'ultima serie di migrazioni.

+0

Concordato. Potresti potenzialmente svuotare l'utilità di "rake db: migrate version = xxx" e creare futuri mal di testa uscendo dalla prenotazione e modificando manualmente schema.rb. – railsdog

Problemi correlati