78

我想用虚拟数据填充新功能,但不想使用 db/seeds.rb 文件,因为它已经包含与此功能无关的其他数据。

要运行默认seeds.rb文件,请运行命令rake db:seed

db如果我在名为的目录中创建一个文件,seeds_feature_x.rbrake 命令(仅)运行该文件会是什么样子?

4

3 回答 3

186

首先创建一个单独的目录来保存您的自定义种子 - 本示例使用db/seeds. 然后,通过将 rakefile 添加到您的lib/tasks目录来创建自定义任务:

# 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 --tasksrake -T.

于 2013-11-09T04:34:34.333 回答
17

我尝试了 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文件播种

于 2015-08-04T16:53:12.740 回答
11

太复杂! 我只是想要一个简单的任务来执行 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
于 2016-05-23T19:09:40.890 回答