添加自定义种子文件

Fel*_*ger 71 ruby rake ruby-on-rails seed ruby-on-rails-3.2

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

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

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

zea*_*soi 171

首先创建一个单独的目录来保存自定义种子 - 此示例使用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
Run Code Online (Sandbox Code Playgroud)

此rakefile接受db/seeds目录中的种子文件的名称(不包括.rb扩展名),然后按原样运行它seeds.rb.您可以通过从命令行发出以下命令来执行rake任务:

rake db:seed:file_name # Name of the file EXCLUDING the .rb extension 
Run Code Online (Sandbox Code Playgroud)

更新:现在它还应该在运行时列出种子任务rake --tasksrake -T.

  • 万一有人想知道,`实习生'是`to_sym`的别名. (20认同)
  • 优秀!我只需要用`filename`(编辑)替换`seed_file`. (3认同)
  • 这对我来说在Ruby 2.2和Rails 4.2.5上运行正常.只确保你调用文件`custom_seed.rake`而不是`custom_seed.rb`(答案是正确的,但无论如何我设法混淆了). (3认同)
  • 我收到“不知道如何构建任务 'db:seed:base'”。我已经按照描述做了,只有我的种子文件叫做 base.rb (2认同)
  • 它会遍历所有文件,但仅尝试加载您指定的文件。它是如何做到这一点的尚不清楚,因为输入不是作为参数传递的,并且没有“if filename == your_passed_filename”来说明这一点。 (2认同)
  • 有点晚了,但是@JosephK 我一开始也很难理解它是如何工作的,所以用一些“puts”语句运行了几次来调试。实际上,这个 rake 脚本会为其在目标目录中找到的每个 *.rb 文件动态创建一个任务。因此,如果您的文件夹包含“seeds_a.rb”、“seeds_b.rb”、“seeds_c.rb”,那么当您调用“db:seed:seeds_a”时,rake 脚本会在“seed”命名空间下生成 3 个任务,称为“seeds_a” `、`seeds_b`、`seeds_c`,每个任务加载相应的文件。由于您调用了任务“seed_a”,因此只有该任务(以及该文件)被执行。 (2认同)

Hea*_*h N 13

我尝试了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
Run Code Online (Sandbox Code Playgroud)

要使用它,请执行以下操作:

rake db:seed:single SEED=<seed_name_without_.seeds.rb>
Run Code Online (Sandbox Code Playgroud)

这将在Rails.root/db/seeds文件夹中查找没有.seeds.rb的文件名(它会为您添加这些文件名).

工作范例:

rake db:seed:single SEED=my_custom_seed
Run Code Online (Sandbox Code Playgroud)

以上将播种该Rails.root/db/seeds/my_custom_seed.seeds.rb文件

  • 这对我来说非常合适!我也没有回答zeantsoi的骰子.然而,我删除了.seeds扩展名.谢谢你的帮助. (2认同)

Aar*_*son 9

太复杂! 我只想要一个简单的任务来执行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
Run Code Online (Sandbox Code Playgroud)

  • 这与rake任务db:seed冲突.我建议改变第2行来读取任务种子:环境做... (2认同)