2011-12-28 27 views
44

Geliştirme ve üretim veritabanımı geliştirmek için seed.rb kullanıyorum. Genellikle ilkini yapay verilerle ve ikincisi, uygulamamın çalışması gereken gerçek minimum verilerle (örneğin, ilk kullanıcı vb.) Dolduruyorum.Geliştirme ve/veya üretim veritabanlarını seçici olarak doldurmak için seed.rb nasıl kullanılır?

Her bir veri hangi ortam için seed.rb cinsinden belirtilebilir?

"Grup" un bir Gemfile yöntemi olduğunu bildiğim için, seed.rb için aynı davranışı elde etmek istiyorum.

E.g. Benim seed.rb böyle bir şey yazmak istiyorum:

group :development do 
    # development specific seeding code 
end 

group :production do 
    # production specific seeding code 
end 

# non-specific seeding code (it always runs) 

Bu, hem gelişme özgü ve spesifik olmayan bir kod

$ rake db:seed 

ile Ve çağırmak çağırmak edebilmek için üretim-spesifik ve spesifik olmayan kod hem:

$ rake db:seed RAILS_ENV=production 

size

cevap

60

ederizsadece basit bir ruby ​​dosyası, bu yüzden buna yaklaşmanın çeşitli yolları vardır. Bir davaya ne dersin?

# do common stuff here 

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

daha fazla ayrıntı sağlayabilir? Kodu girdikten sonra hangi komutları kullanıyorsunuz? Yalnızca değişikliklerin üretim veritabanına gitmesini ve belirtilmemiş tüm diğer verileri silmemesini nasıl sağlarız? (Hedef veritabanı, bunun için boşsa, diğer verileri silmek istediğinizi düşünebilir) vb. – ahnbizcad

+0

@ahnbizcad config/database.yml dosyası aracılığıyla. Üretim veritabanını yanı sıra geliştirme veritabanını da siz belirlersiniz. – ruzenhack

31

başka bir yaklaşım oluşturarak olabilir:

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

db/seeds.rb yılında:

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

Sonra ilgili dosyasındaki her ortam için çalıştırmak istediğiniz kod yazmak.

+2

güzel. Bu yararlı buldum ancak ben test etmek istemiyorum bu yüzden ya bir tohum/test.rb dosya ya da (diğer hatalar ile birlikte) bulunamadı dosya tuzağı (ya da bu nedenle test sonlandırmaya gerek yok) ya da test etmek istemiyorum. – Ben

6

@ Fabro cevabı oldukça benzer başka yaklaşım,: daha

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

sizin seed.rb yılında,: gibi bir şey almak böylece , çevre adları ve başka adlandırılmış common.rb ile db/ bir klasör tohumlarını ekleyin : bir işlemde tohum çalışan perfer

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 

İlgili konular