添加自定义种子文件


74

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

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

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


我对您的情况很感兴趣,是否尝试过任何代码?再一次,为什么需要另一个seed文件?您是否已尝试从中调用另一种方法seeds.rb?上次我seeds.rb
习惯

如果我运行seeds.rb,它将为我的应用程序添加许多我不需要的其他数据。这就是为什么我不想碰它并拥有一个新的种子文件的原因。
陌生人研究员

我知道,我从来没有尝试过,但是我曾经通过迁移来做到这一点:P想尝试一下吗?大声笑,当我有一个新主意时,我会去的,但如果您发现了一个新主意,请进行更新。
ksugiarto

您可以创建执行单个种子文件的自定义rake任务。我在下面的答案中包含了一个示例...
zeantsoi 2013年

Answers:


179

首先创建一个单独的目录来保存您的自定义种子-此示例使用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 --tasks或时列出种子任务rake -T


3
优秀的!我只需要替换seed_filefilename(已编辑)。
陌生人研究员

20
万一有人奇怪,intern是的别名to_sym
PJSCopeland 2014年

2
我收到“不知道如何构建任务'db:seed:base'”。我已经描述过,只有我的种子文件叫做base.rb
ancajic

1
它运行所有文件,但仅尝试加载您指定的文件。这样做的方式尚不清楚,因为没有将输入作为参数传递,并且没有“ if filename == your_passed_filename”可以使它清楚。
JosephK '16

3
在Ruby 2.2和Rails 4.2.5上,这对我来说工作正常。仅确保您custom_seed.rake而不是调用文件custom_seed.rb(答案是正确的,但我还是设法将其混合了)。
vindia '16

15

我尝试了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,2015年

10

太复杂! 我只是想要一个简单的任务来执行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行以读取任务种子:: environment do ...
John Doe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.