2011-12-28 4 views
44

Sto usando seed.rb per popolare sia il mio database di sviluppo che di produzione. Di solito compilo il primo con i dati fittizi e il secondo con i dati minimi reali che la mia app deve eseguire (ad es. Il primo utente e così via).Come utilizzare seed.rb per popolare in modo selettivo i database di sviluppo e/o di produzione?

Come posso specificare in seed.rb per quale ambiente sono i dati?

Dato che so che "gruppo" è un metodo Gemfile, mi piacerebbe ottenere lo stesso comportamento per seed.rb.

E.g. Mi piacerebbe scrivere qualcosa come questo nel mio seed.rb:

group :development do 
    # development specific seeding code 
end 

group :production do 
    # production specific seeding code 
end 

# non-specific seeding code (it always runs) 

questo per essere in grado di chiamare sia lo sviluppo-specifico e il codice non specifica con

$ rake db:seed 

E per chiamare sia la produzione specifico e il codice non specifica con:

$ rake db:seed RAILS_ENV=production 

Grazie

risposta

60

seeds.rb è solo un semplice file di rubini, quindi ci sono molti modi in cui puoi avvicinarti a questo. Che ne dici di una dichiarazione di un caso?

# do common stuff here 

case Rails.env 
when "development" 
    ... 
when "production" 
    ... 
end 
+1

si può fornire maggiori dettagli? Una volta che lo hai inserito, quali comandi usi? Come si fa a garantire che solo le modifiche vadano al database di produzione e non vengano cancellati tutti gli altri dati non specificati (il database di destinazione potrebbe pensare di voler cancellare altri dati se il seme è vuoto) ecc. – ahnbizcad

+0

@ahnbizcad lo si assicura attraverso il file 'config/database.yml'. Si imposta l'obiettivo del database di produzione lì, così come il database di sviluppo. – ruzenhack

31

Un altro approccio potrebbe essere la creazione di:

db/seeds/development.rb 
db/seeds/production.rb 
db/seeds/any_other_environment.rb 

Poi nel db/seeds.rb:

# Code you want to run in all environments HERE 
# ... 
load(Rails.root.join('db', 'seeds', "#{Rails.env.downcase}.rb")) 

quindi scrivere il codice che si desidera eseguire per ogni ambiente nel rispettivo file.

+2

bello. trovato utile, ma non volevo effettuare il seed test, quindi è necessario avere un file seed/test.rb vuoto oppure è possibile intercettare il file non trovato (insieme ad altri errori) in modo da non terminare i test. – Ben

6

un altro approccio, molto simile a @ di Fabro risposta: aggiungere un semi cartelle per db/ con i nomi di ambiente ed un altro common.rb di nome, in modo da ottenere qualcosa di simile a:

db/seeds/common.rb 
db/seeds/development.rb 
db/seeds/staging.rb 
db/seeds/production.rb 

che, nel vostro seed.rb :

ActiveRecord::Base.transaction do 
    ['common', Rails.env].each do |seedfile| 
    seed_file = "#{Rails.root}/db/seeds/#{seedfile}.rb" 
    if File.exists?(seed_file) 
     puts "- - Seeding data from file: #{seedfile}" 
     require seed_file 
    end 
    end 
end 

I perfer correre il seme in una transazione