如何使用seed.rb有选择地填充开发和/或生产数据库?

时间:2011-12-28 22:44:22

标签: ruby-on-rails ruby-on-rails-3 environment

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

谢谢

3 个答案:

答案 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

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