2011-12-28 10 views
44

私は、開発と本番データベースの両方にseed.rbを使用しています。私は通常最初のデータにダミーデータを、後者にはアプリが実行する必要がある実際の最小データ(たとえば最初のユーザーなど)を入力します。seed.rbを使用して開発データベースおよび/または本番データベースに選択的にデータを取り込む方法

各データの環境をseed.rbでどのように指定できますか?

"group"が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

ありがとうは単純なルビファイルであるため、これにはいくつかの方法があります。ケースステートメントはどうですか?

# do common stuff here 

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

あなたはより詳細な情報を提供することができますか?コードを記述したら、どのコマンドを使用しますか?変更内容だけを本番データベースに確実に渡し、指定されていない他のすべてのデータを消去しないようにするにはどうすればよいですか(対象データベースは、その種が空の場合は他のデータを消去したいと考えるかもしれません)。 – ahnbizcad

+0

@ahnbizcad 'config/database.yml'ファイルを使用します。本番データベースのターゲットと開発データベースを設定します。 – ruzenhack

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

nice。しかし、私はシードテストをしたくなかったので、空のシード/ test.rbファイルを持っているか、見つからないファイルを他のエラーと一緒にトラップしてテストを終了しないようにする必要があります。 – Ben

6

@ファブロの答えに非常に似別のアプローチ、:より

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

あなたseed.rbで、:あなたのような何かを得るよう は、環境名と別の名前のcommon.rbとdb/にフォルダの種を追加:私は1つのトランザクションでシードを実行しているperfer

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 

関連する問題