11

以下のような 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
4

2 に答える 2

31

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

db:seedアプリが機能するために必要な初期データ用です。テストおよび/または開発目的ではありません。

私がやっていることは、サンプル データを入力する 1 つのタスクと、データベースをドロップして作成、移行、シード、入力する別のタスクを用意することです。すばらしいことに、これは他のタスクで構成されているため、どこにもコードを複製する必要はありません。

# 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
于 2014-06-30T18:19:09.103 に答える
-4

rake db:seed自給自足をお勧めします。つまり、ロードする必要のあるサンプル データがロードされるようにしながら、損傷を与えることなく複数回実行できるはずです。

したがって、研究のために、db:seed タスクは次のようにする必要があります。

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

これを何度も何度も実行すると、常に 10 人のランダム ユーザーになることが保証されます。

これは開発用だと思います。その場合、本番環境で実行される可能性があるため、db:seed には入れません。ただし、必要に応じて何度でも再実行できる同様の rake タスクに入れることができます。

于 2013-07-10T20:20:41.167 に答える