Appunti di Matteo


Import export con active record

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 =)



teo: Oct 11, 2008 00:00:00 GMT
tags: rails
blog comments powered by Disqus
Ultimi post


Tags



Progetti su github


Curriculum

matteo parmiLa mia fantastica ed entusiasmante carriera professionale. Curriculum via googledocs, aggiornato a bassa frequenza.


fatto con: webby, blueprint css e jquery