2011-12-28 57 views
44

我正在使用seed.rb來填充我的開發和生產數據庫。我通常用虛擬數據填充第一個數據,後者使用我的應用程序需要運行的真實最小數據(例如第一個用戶等)填充。如何使用seed.rb選擇性地填充開發和/或生產數據庫?

如何在seed.rb中指定每個數據是什麼環境?

鑑於我知道「組」是一個Gemfile方法,我想爲seed.rb實現相同的行爲。

例如我想寫這樣的事情在我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) 

這是能夠同時調用特定的發展和非特異性代碼

$ rake db:seed 

,並呼籲生產專用,並與非特異性兩種代碼:

$ rake db:seed RAILS_ENV=production 

謝謝

回答

60

seeds.rb只是一個普通的ruby文件,所以有幾種方法可以解決這個問題。案例陳述如何?

# do common stuff here 

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

可以爲您提供更多的細節?一旦你編寫代碼,你使用了什麼命令?如何確保只有更改進入生產數據庫,並且不清除所有未指定的其他數據(如果目標數據庫的種子爲空,則目標數據庫可能認爲要清除其他數據)等。 – ahnbizcad 2014-11-06 00:42:09

+0

@ahnbizcad您確保它通過'config/database.yml'文件。您在那裏設置生產數據庫目標以及開發數據庫。 – ruzenhack 2017-08-03 03:13:55

31

另一種方法可以創建:

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

然後在db/seeds.rb

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

然後寫你想在各自的文件中的每個環境中運行的代碼。

+2

不錯。發現這個有用,但是我不想種子測試,所以你需要有一個空的種子/ test.rb文件,或者你可以捕獲找不到的文件(以及其他錯誤),所以它不會終止測試。 – Ben 2015-01-18 05:57:22

6

另一種方法,神似@ FABRO的回答是: 添加文件夾種子db/與環境的名稱,另一個名爲common.rb,所以你喜歡的東西:

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

比,你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 

我perfer在一個事務中運行種子

相關問題