2009-04-15 16 views
11

Ho visto molte discussioni relative alle Migrazioni di ActiveRecord e se debbano o meno essere utilizzate per modificare i dati all'interno della vostra applicazione, alcune persone dicono "Sì" dicendo "no". La mia domanda è se non stai usando le Migrazioni per fare questo, allora cosa stai usando? Solo un altro copione che scrivi?Come si cambiano i dati dell'app Rails?

Sono in cerca di suggerimenti su modi alternativi e perché potrebbero essere un'idea migliore rispetto all'utilizzo delle migrazioni.

risposta

14

Un problema arriva se si utilizza la condizione

rake db:reset 

e

rake db:schema:load 

compiti, che utilizzano schema.rb come base per la configurazione del database. Quindi nessun dato viene caricato e tu sei bloccato.

In Agile Web Development with Rails, Third Edition, che si dovrebbe ottenere (? Se il libro di Ruby è il libro "Piccone", questo dovrebbe essere il libro "Amaca", btw) se non l'hai già fatto, DHH dice:

... le migrazioni non sono in realtà destinate a trasportare i dati seme. Sono troppo temporali nella natura per farlo in modo affidabile. Le migrazioni sono qui per portarti da una versione dello schema alla successiva, per non creare uno schema nuovo da scratch-abbiamo il file db/schema.rb per quello.

Così, non appena si in realtà andare avanti con una vera e propria applicazione, la gente non sarà in esecuzione tuoi primi migrazioni quando hanno istituito l'applicazione . Iniziano da qualsiasi versione sia archiviata in db/schema.rb e ignora tutte le migrazioni precedenti di . Ciò significa che lo dei dati creati dalle migrazioni non viene mai inserito nel database, quindi non è possibile fare affidamento su .

Ci sono molti modi alternativi per avere più dati di seme permanenti . Il più semplice è probabilmente solo per creare un nuovo file in db/seed.rb, che contiene quelle chiamate Product.create che eseguiranno l'installazione . Questo file può quindi essere chiamato dopo rake db: schema: load crea lo schema iniziale .

+1

In realtà, 'rake db: reset' esegue anche' rake db: seed', quindi tutti i dati nel file di semi vengono caricati insieme ad esso. – lobati

4

un sacco di volte, le migrazioni sono la soluzione migliore e non possono essere sostituite con uno script separato. Immagina il seguente scenario: l'applicazione è già in uso con i dati in tempo reale; la colonna del codice contiene un codice nel formato "nome-zip_code" (sì, lo so che è brutto, ma succede), e tu vuoi dividerlo in due colonne, "nome" e "codice_zip", mentre ti sbarazzi del " codice 'colonna.


def self.up 
    add_column :companies, :zip_code, :integer 
    add_column :companies, :name, :string 
    Company.reset_column_information 
    Company.find(:all).each do |company| 
    name, zip_code = company.code.split('-') 
    company.update_attributes(:name => name, :zip_code => zip_code) 
    end 
    remove_column :companies, :code 
end 

in questo caso, la colonna di codice non può essere rimossa prima che i dati vengano trasferiti alle colonne nome e codice postale.

1

Quando ho bisogno di modificare alcuni dati nel database, creerò un'attività Rake che esegue alcune funzioni di libreria per eseguire il lavoro.In questo modo, la manipolazione dei dati sarà ripetibile e, se necessario, può essere eseguita anche da una migrazione.

Problemi correlati