添加自定义种子文件

我想用虚拟数据填充一个新特性,但不想使用 db/Seeds.rb 文件,因为它已经有了与该特性无关的其他数据。

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

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

44580 次浏览

首先创建一个单独的目录来保存自定义种子——这个示例使用 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时的种子任务。

我尝试了 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 文件夹中查找一个没有. Seed.rb 的文件名(它为您添加了这些文件名)。

实例:

rake db:seed:single SEED=my_custom_seed

上面的代码将为 Rails.root/db/seeds/my_custom_seed.seeds.rb文件播种

太复杂了! 我只需要执行一个简单的任务,即在不传入任何文件名的情况下执行 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