我正在使用seed.rb来填充我的开发和生产数据库。我通常使用虚拟数据填充第一个,后者使用我的应用程序需要运行的实际最小数据(例如第一个用户等)。
如何在seed.rb中指定每个数据的环境?
鉴于我知道“group”是一个Gemfile方法,我想为seed.rb实现相同的行为。
E.g。我想在我的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
谢谢
答案 0 :(得分:70)
seeds.rb
只是一个普通的ruby文件,所以有几种方法可以解决这个问题。案例陈述怎么样?
# do common stuff here
case Rails.env
when "development"
...
when "production"
...
end
答案 1 :(得分:34)
另一种方法可能是创造:
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 :(得分:10)
另一种方法,与@ fabro的答案非常相似:
使用环境名称和另一个名为common.rb的文件夹添加文件夹种子到db/
,这样就可以得到类似的内容:
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
我更喜欢在一次交易中运行种子