如何使用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
我更喜欢在一次交易中运行种子