2013-04-03 18 views
8

私はすでに、RailsプロジェクトをテストするためのFactoryGirlファクトリ定義をいくつか構築しました。この目的のためにはうまく機能しています。FactoryGirlファクトリを使用して開発データベースを構築するにはどうすればよいですか?

私は今、Rails開発データベースに有効で適切に関連付けられたレコードの大量のコレクションを入れるために、スクリプト(Ruby、Rakeなど)で同じ定義を使用したいと考えています。

これは一般的な作業だと確信していますが、参考になるものはありません。

ベストプラクティスとは何ですか?どうやって進める?

工場がspec/factories.rbにあるとします。次は何?ありがとう。

アップデートはまだ苦労します。これをrakeという仕事として試してみましょう。

require 'factory_girl' 
require 'spec/factories' 

namespace :db do 
    desc "Fill database with trial data" 
    task :populate => :environment do 
    Rake::Task['db:reset'].invoke 
    50.times do |n| 
     # Make a consistent set of related records. 
     team = FactoryGirl.create(:team, :completed) 
     team.members << FactoryGirl.create(:member) 
     FactoryGirl.create(:design, :team => team) 
    end 
    end 
end 

ああ、これは私のfactories.rbを見つけることができません。他のどこでも

rake aborted! 
cannot load such file -- spec/factories 

プロジェクトルート相対パスは正常に動作が必要です。秘密の握手は何ですか?

+1

これは通常、シードファイルの作業です。シードを使用してDBを作成したくない理由はありますか? –

+0

種子について聞いたことがありません。あなたは参考にしてもらえますか? (レールを学ぶほとんどの日はスカベンジャーの狩りのようだ...) – Gene

+1

@Gene http://railscasts.com/episodes/179-seed-data –

答えて

1

私のコメントで述べたように、これは通常、種データの作業です。あなたの環境ごとにファイルを作成する機能を与えるだろう

namespace :db do 
    task :seed => :environment do 
    env_seed_file = File.join(Rails.root, 'db', 'seeds', "#{Rails.env}.rb") 
    load(env_seed_file) if File.exist?(env_seed_file) 
    end 
end 

(すなわちデシベル:あなただけの開発データベースに播種することにあなたは、このデータが必要な場合は、このような何かを行うことによって seed rakeタスクを修正することができます/seeds/development.rb)。 seedbankのような宝石を使うこともできます。これは、環境固有のシードファイルと、すでにRailsに入っているものを追加します。

+0

ありがとうございます。 'seeds.rb'ファイルには、requireのための完全な環境ロードパスがありますので、FactoryGirlと私の工場は正常に動作しています。私はコードを 'if Rails.env == 'development''にラップして、非開発データベースにランダムなレコードを生成しないようにしました。より複雑な要件が現れる場合は、後ほどより一般的なソリューションを使用します。 – Gene

+0

factory_girlでテストデータを生成する方法を見ている間に、この回答が見つかりました。通常、データベースにシードすることは、テストデータをデータベースに追加するのではなく、開発と生産の初期レコードを作成するために使用されます。 ([ここ](http://railscasts.com/episodes/179-seed-data?view=asciicast)と[ここ](http://www.xyzpub.com/en/ruby-on-rails/3.2)を参照してください/seed_rb.html)) –

0

@Gene あなたはこのパズルを解きほぐしていました。私はあなたがこれから離れた道のりだと思う。 私はRSpecを使用していないので、パスは少し異なるかもしれませんが、あなたは一般的な考え方を持っています。

namespace :db do 
    desc "Fill database with trial data" 
    task :populate => :environment do 
    require 'factory_girl' 
    require Rails.root + 'spec/factories' 

    Rake::Task['db:reset'].invoke 
    Rake::Task['db:seed'].invoke 
    50.times do |n| 
     # Make a consistent set of related records. 
     team = FactoryGirl.create(:team, :completed) 
     team.members << FactoryGirl.create(:member) 
     FactoryGirl.create(:design, :team => team) 
    end 
    end 
end 

私は必要なファクトリファイルのパスを正確に指定し、リセット後にrake db:seedも追加します。

DBシードは、開発時にデータベースに入力するのではなく、新しいアプリケーションを適切な情報でブートストラップして正常に動作するようにします。すなわち、管理者ユーザーとデフォルトステータスの作成

関連する問題