Adding a custom seed file Adding a custom seed file ruby ruby

Adding a custom seed file


Start by creating a separate directory to hold your custom seeds – this example uses db/seeds. Then, create a custom task by adding a rakefile to your lib/tasks directory:

# lib/tasks/custom_seed.rakenamespace :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  endend

This rakefile accepts the name of a seed file in the db/seeds directory (excluding the .rb extension), then runs it as it would run seeds.rb. You can execute the rake task by issuing the following from the command line:

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

Update: Now it should also list the seed tasks when running rake --tasks or rake -T.


I tried out zeantsoi's answer but it didn't give me what I wanted, it did all files in a directory. Hacked away at it and got this.

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  endend

And to use this do the following:

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

This will look in the Rails.root/db/seeds folder for a file name without the .seeds.rb (it adds those for you).

Working example:

rake db:seed:single SEED=my_custom_seed

The above would seed the Rails.root/db/seeds/my_custom_seed.seeds.rb file


Too complicated!I just wanted a simple task to execute every file under db/seeds directory without passing in any file names.

# lib/tasks/seed.rakedesc "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  endend