2010-02-05 9 views
16

Il nostro team sta sviluppando un'app Rails su MySQL e utilizzando config.active_record.schema_format = :sql per The Rails Guides.I valori AUTO_INCREMENT non sincronizzati in development_structure.sql da Rails/MySQL creano il disturbo differenziale

Naturalmente, i valori AUTO_INCREMENT in development_structure.sql non vengono sincronizzati durante lo sviluppo parallelo. Sappiamo che avere valori diversi nei nostri database per AUTO_INCREMENT non è un problema tecnico. Tuttavia, crea un sacco di rumore diff quando abbiamo diff prima del check-in. In più di un'occasione abbiamo rotto la nostra build perché uno di noi ha perso un importante cambiamento in development_structure.sql che è stato camuffato da tutto il rumore.

Qualche suggerimento su come eliminare questo disturbo diff in modo che i nostri occhi possano concentrarsi su modifiche importanti?

Grazie.

+0

È una domanda stupida? –

+0

Come si presenta la differenza attuale? Potrebbe essere necessario aggiornare il tuo strumento di diffusione. –

+0

Il diff era soddisfacente. Ha dimostrato che il database MySQL di sviluppo di ogni sviluppatore aveva un valore AUTO_INCREMENT diverso per ogni tabella, che si verifica naturalmente quando gli sviluppatori creano i record sulle proprie macchine. –

risposta

7

Una variante della risposta accettata è quella di includere quanto segue in un file .rake in lib/task:

Rake::Task["db:structure:dump"].enhance do 
    path = Rails.root.join('db', 'structure.sql') 
    File.write path, File.read(path).gsub(/ AUTO_INCREMENT=\d*/, '') 
end 

Questo ha il vantaggio di rendere il cambiamento nel comportamento appaiono più intenzionale (come suggerito da: http://edgar.tumblr.com/post/52300664342/how-to-extend-an-existing-rake-task), esp. se inserito in un file con nome descrittivo (ad esempio "skip_auto_increment.rake").

5

A Razoo, abbiamo finito l'override db: la migrazione

task :migrate do 
    Rake::Task['db:migrate'].invoke 
    Rake::Task['db:structure:dump'].invoke 
end 

e poi db: Struttura: discarica

namespace :structure do 
    desc "Dump the database structure to a SQL file" 
    task :dump do 
     Rake::Task['db:structure:dump'].invoke 
     # open up the development_structure.sql file and gsub AUTO_INCREMENT=\d* with AUTO_INCREMENT 
    end 
    end 
end 
12

@Ian, vi ringrazio molto per il suggerimento. Ma su Rails 3.2 ora è molto più semplice. Non è necessario richiamare le attività poiché porta a errori di livello troppo elevato a livello di stack e non è necessario sovrascrivere la descrizione dell'attività. Quindi il mio codice è così:

namespace :db do 
    namespace :structure do 
    task :dump do 
     path = Rails.root.join('db', 'structure.sql') 
     File.write path, File.read(path).gsub(/ AUTO_INCREMENT=\d*/, '') 
    end 
    end 
end 

lavori sia per db:migrate e db:structure:dump.

+0

Questo non funziona con Ruby 1.9.2 "metodo non definito' scrivi 'per File: Classe " – Jan

+0

Questo metodo è disponibile in 1.9.3 – sekrett

+0

Dove si inserisce questo codice nel progetto Rails? – abeger