如何使用seed.rbselect性地填充开发和/或生产数据库?

我正在使用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 

谢谢

seeds.rb只是一个普通的ruby文件,所以有几种方法可以处理这个问题。 如何处理案件陈述?

 # do common stuff here case Rails.env when "development" ... when "production" ... end 

另一种方法可能是创造:

 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")) 

然后在相应文件中编写要运行的每个环境的代码。

另一种方法,非常类似于@ 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 

我更喜欢在一次交易中运行种子