2011-12-28 8 views
44

Używam seed.rb do zapełnienia zarówno mojej bazy danych rozwoju i produkcji. Zwykle zapełniam pierwsze danymi fikcyjnymi, a druga prawdziwymi minimalnymi danymi, które musi uruchomić moja aplikacja (np. Pierwszy użytkownik itd.).Jak używać seed.rb do selektywnego zapełniania baz danych programistycznych i/lub produkcyjnych?

Jak określić w pliku seed.rb, w jakim środowisku są poszczególne dane?

Biorąc pod uwagę, że znam "grupę" jako metodę Gemfile, chciałbym osiągnąć to samo zachowanie dla seed.rb.

E.g. Chciałbym napisać coś takiego w moim 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) 

to, aby móc wywołać zarówno rozwój specyficzne i niespecyficzne kod z

$ rake db:seed 

i wezwać zarówno produkcja specyficzne i niespecyficzne kod z:

$ rake db:seed RAILS_ENV=production 

Dziękuję

Odpowiedz

60

seeds.rb to zwykły plik ruby, więc możesz podejść do tego na kilka sposobów. Co powiesz na orzeczenie?

# do common stuff here 

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

można podać więcej szczegółów? Kiedy już to zrobisz, jakich poleceń używasz? Jak zapewnić, że tylko zmiany trafiają do produkcyjnej bazy danych, a nie usuwać wszystkich innych danych nieokreślonych (docelowa baza danych może myśleć, że chcesz usunąć inne dane, jeśli materiał siewny jest pusty) itd. – ahnbizcad

+0

@ahnbizcad możesz to zapewnić poprzez plik 'config/database.yml'. Ustawiono tam docelową bazę danych do produkcji, a także bazę danych programistycznych. – ruzenhack

31

Innym rozwiązaniem mogłoby być stworzenie:

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

Następnie w db/seeds.rb:

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

Następnie należy napisać kod, który chcesz wykonać dla każdego środowiska w danym pliku.

+2

ładny. okazało się to przydatne, ale nie chciałem wysyłać testu, więc musisz albo mieć pusty plik seed/test.rb, albo możesz uwięzić plik nie znaleziony (wraz z innymi błędami), aby nie kończył testów. – Ben

6

inne podejście, całkiem podobny do użytkownika @ FABRO odpowiedź: dodać nasiona folderu do db/ z nazwiskami środowiska i innej nazwie common.rb, więc masz coś takiego:

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

niż w swoją 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 działa nasion w jednej transakcji

Powiązane problemy