Le migrations in rails sono un figata lo sò…ma fino ad un certo punto. Se si lavora in piu’ persone su un progetto, ovviamente con git e quindi in modo distribuito, alla fine piu di una volta si può incorrere in conflitti di versione e migrazioni che falliscono,per non parlare poi dei cambiamenti di schema.rb.
Dopo vari tentativi, sono giunto alla conlusione che la cosa migliore è che in qualunque momento si possa fare rake db:drop/db:migrate senza aver paura che qualcosa vada storto.E come? Semplice, facendo un refactoring costante delle migrazioni.Ovvero mantenere una migrazione per tabella ed una per i dati di default. Quindi se cambio il nome di un campo in una tabella, al posto di creare una nuova migrazione, modifico quella della tabella corrispondente e rigenero da zero il db.
E per i dati inseriti fino a quel momento nelle tabelle?
Spesso, quando sto lavorando su un progetto nuovo, sento il bisogno di avere dati reali.
Avere solo gran quantità di lorem ipsum non è poi il massimo, anche se basta scrivere lorem e poi tab in textmate per averne in abbondanza. Presto o tardi comincio a dare l’indirizzo di sviluppo (di solito il mio mbp) e lascio inserire i dati reali da chi riesco a convincere, copy, stagisti, pm, fattorini delle piadine e cosi’ via.
Io tengo a quei dati semi-veri, quindi ho messo insieme queste 2 righe di codice per preservarli:
#variabili model = Job bk_file = RAILS_ROOT+"/db/migrate/"+model.to_s.pluralize+".bk.yml" #export File.open(bk_file, 'w') {|f| f.write(model.find(:all).to_yaml.gsub!(/\n/, "\r\n")) } #import (mantiene gli id, quindi svuotare la tabella) YAML.load(File.read(bk_file)).each { |job| job.instance_variable_set("@new_record", true); job.save }
#lib/migration_helpers.rb module MigrationHelpers def restore_default_data(modello) bk_file = load_path(modello) #import (mantiene gli id, quindi svuotare la tabella) YAML.load(File.read(bk_file)).each { |job| job.instance_variable_set("@new_record", true); job.save } end def save_default_data(modello) bk_file = load_path(modello) #export File.open(bk_file, 'w') {|f| f.write(modello.find(:all).to_yaml.gsub!(/\n/, "\r\n")) } end private def load_path(modello) RAILS_ROOT+"/db/migrate/"+modello.to_s.pluralize+".bk.yml" end end
UPDATE: ho trovato questo plugin che fa tutto quanto sopra e anche meglio =)
La mia fantastica ed entusiasmante carriera professionale.
Curriculum via googledocs, aggiornato a
bassa frequenza.
fatto con: webby, blueprint css e jquery