web-dev-qa-db-ja.com

カスタムシードファイルの追加

新しい機能にダミーデータを設定したいのですが、db/seeds.rbファイルを使用したくないのは、この機能に関係のない他のデータが既にシードされているからです。

デフォルトのseeds.rbファイルを実行するには、rake db:seedコマンドを実行します。

seeds_feature_x.rbという名前のdbディレクトリにファイルを作成した場合、そのファイルを実行する(のみ)rakeコマンドはどのようになりますか?

69
Fellow Stranger

カスタムシードを保持する別のディレクトリを作成することから始めます。この例ではdb/seedsを使用します。次に、lib/tasksディレクトリにrakefileを追加して、カスタムタスクを作成します。

# lib/tasks/custom_seed.rake
namespace :db do
  namespace :seed do
    Dir[Rails.root.join('db', 'seeds', '*.rb')].each do |filename|
      task_name = File.basename(filename, '.rb')
      desc "Seed " + task_name + ", based on the file with the same name in `db/seeds/*.rb`"
      task task_name.to_sym => :environment do
        load(filename) if File.exist?(filename)
      end
    end
  end
end

このrakefileは、db/seedsディレクトリ内のシードファイルの名前(.rb拡張子を除く)を受け入れ、seeds.rbを実行するように実行します。コマンドラインから次のコマンドを発行して、rakeタスクを実行できます。

rake db:seed:file_name # Name of the file EXCLUDING the .rb extension 

更新:rake --tasksまたはrake -Tの実行時にシードタスクも一覧表示されるようになりました。

164
zeantsoi

私はzeantsoiの答えを試しましたが、それは私が望むものを与えませんでした、それはディレクトリ内のすべてのファイルをしました。それをハックしてこれを手に入れました。

namespace :db do
  namespace :seed do
    task :single => :environment do
      filename = Dir[File.join(Rails.root, 'db', 'seeds', "#{ENV['SEED']}.seeds.rb")][0]
      puts "Seeding #{filename}..."
      load(filename) if File.exist?(filename)
    end
  end
end

これを使用するには、次の手順を実行します。

rake db:seed:single SEED=<seed_name_without_.seeds.rb>

これにより、Rails.root/db/seedsフォルダーで.seeds.rbなしのファイル名が検索されます(これらは自動的に追加されます)。

作業例:

rake db:seed:single SEED=my_custom_seed

上記はRails.root/db/seeds/my_custom_seed.seeds.rbファイルをシードします

12
Heath N

複雑すぎる!ファイル名を渡さずにdb/seedsディレクトリの下にあるすべてのファイルを実行する単純なタスクが必要でした。

# lib/tasks/seed.rake
desc "Run all files in db/seeds directory"

namespace :db do
  task seed: :environment do
    Dir[File.join(Rails.root, 'db', 'seeds', '*.rb')].each do |filename|
      puts "seeding - #{filename}. for reals, yo!"
      load(filename)
    end
  end
end
9
Aaron Henderson