添加自定义种子文件

80
我想用虚拟数据填充新功能,但不想使用db/seeds.rb文件,因为它已经包含了与该功能无关的其他种子数据。
要运行默认的seeds.rb文件,您可以运行命令rake db:seed。
如果我在db目录中创建一个名为seeds_feature_x.rb的文件,要运行(仅)该文件的rake命令会是什么样子?

我对你的情况很感兴趣,你有尝试过任何代码吗?再说一遍,为什么需要另一个seed文件?你有尝试从seeds.rb中调用另一个方法吗?上次我使用seeds.rb从其他模型中调用了一个导入功能 - ksugiarto
如果我运行seeds.rb,它会为我的应用程序提供许多其他我不需要的数据。这就是为什么如果可能的话,我不想碰它并拥有一个新的种子文件的原因。 - Fellow Stranger
您可以创建一个自定义的Rake任务,以执行单个种子文件。我在下面的答案中包含了一个示例... - zeantsoi
3个回答

189

首先创建一个单独的目录来存放你的自定义种子 - 这个例子使用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 --tasksrake -T时,还应列出种子任务。

3
太好了!我只需要将“seed_file”替换为“filename”(编辑后)。 - Fellow Stranger
23
如果有人想知道,internto_sym的别名。 - PJSCopeland
2
它遍历所有文件,但只尝试加载您指定的文件。它如何做到这一点并不清楚,因为输入未作为参数传递,并且没有 "if filename == your_passed_filename" 来明确说明。 - JosephK
3
在我的 Ruby 2.2 和 Rails 4.2.5 上,这个很好用。只需确保将文件命名为 custom_seed.rake 而不是 custom_seed.rb(答案是正确的,但我还是搞混了)。 - vindia
2
有点晚了,但是@JosephK,我一开始也很难理解它是如何工作的,所以运行了几次并加入了一些puts语句进行调试。实际上,这个rake脚本会动态地为目标目录中找到的每个*.rb文件创建一个任务。因此,如果您的文件夹包含seeds_a.rbseeds_b.rbseeds_c.rb,那么当您调用db:seed:seeds_a时,rake脚本会在seed命名空间下生成3个任务,分别称为seeds_aseeds_bseeds_c,每个任务都加载相应的文件。由于您调用了任务seed_a,因此只有该任务(因此只有该文件)会被执行。 - asibs
显示剩余4条评论

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文件中添加种子数据。


2
这对我完美地起作用了!我在尝试zeantsoi的答案时没有成功。不过我把“.seeds”扩展名移除了。感谢您的帮助。 - themattkellyshow

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

2
这与rake任务db:seed冲突。我建议将第2行更改为task seeds: :environment do ... - John Doe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接