2013-07-10 8 views
7

私は以下のようなRakeスクリプトを持っていますが、データベースを削除したり、すべての移行を実行したり、データベースを再シードしたり、サンプルデータを追加しますか?レールはサンプルデータを追加するための推奨方法

namespace :db do 

    desc 'Fill database with sample data' 
    task populate: :environment do 
    purge_database 
    create_researchers 
    create_organisations 
    add_survey_groups_to_organisations 
    add_members_to_survey_groups 
    create_survey_responses_for_members 

    end 
end 


    def purge_database 
     puts 'about to drop and recreate database' 
     system('rake db:drop') 
     puts 'database dropped' 
     system('rake db:create') 
     system('rake db:migrate') 
     system('rake db:seed') 
     puts 'Database recreated...' 
    end 

    def create_researchers 
     10.times do 
     researcher = User.new 
     researcher.email = Faker::Internet.email 
     researcher.save! 
     end 
    end 
+0

これはテスト環境用ですか? –

+0

これは開発環境用です – Lee

答えて

-3

私はrake db:seedを自己完結させることを提案します。つまり、ロードする必要のあるサンプルデータがロードされるようにしながら、ダメージを与えずに複数回実行できるはずです。

だから、あなたの研究のために、DB:シードタスクは、このような何かをする必要があります

User.destroy_all 
10.times do 
    researcher = User.new 
    researcher.email = Faker::Internet.email 
    researcher.save! 
end 

あなたはこの何度も繰り返し実行することができますし、常に10人のランダムなユーザーとなってしまいますが保証されています。

これは開発用です。その場合、私はそれをdb:seedに入れることはしません。しかし、必要に応じて頻繁に再実行することができる同様のレーキタスクに入れることができます。

+8

'db:seed'はサンプルデータでデータベースを埋める正しい方法ではありません。 – Agis

23

あなたはではありませんdb:seedでサンプルデータをデータベースに入力してください。それはシードファイルの目的ではありません。

db:seedは、機能するために、が必要な初期データ用です。テストや開発目的ではありません。

私が行うのは、サンプルデータを投入するタスクと、データベースを削除し、作成し、移行し、シードし、移入する別のタスクを持つことです。クールなのは、それが他のタスクで構成されているため、どこにでもコードを複製する必要はありません:

# lib/tasks/sample_data.rake 
namespace :db do 
    desc 'Drop, create, migrate, seed and populate sample data' 
    task prepare: [:drop, :create, "schema:load", :seed, :populate_sample_data] do 
    puts 'Ready to go!' 
    end 

    desc 'Populates the database with sample data' 
    task populate_sample_data: :environment do 
    10.times { User.create!(email: Faker::Internet.email) } 
    end 
end 
+2

これは受け入れられた答えです:シードとタスク – yamori

+0

@agisこれを行うといくつかのActiveRecord属性が失われる何らかの理由はありますか? https://stackoverflow.com/questions/44381014/the-case-of-the-disappearing-activerecord-attribute –

+0

これは、 'migrate'の代わりに' schema:load'でなければなりません。データベースを再起動するたびにマイグレーションを再実行しないでください。これは 'db/schema.rb'の目的です。公式ガイド:http://guides.rubyonrails.org/active_record_migrations.html#what-are-schema-files-for-questionmark – brainbag

関連する問題