【问题标题】:Adding a custom seed file添加自定义种子文件
【发布时间】:2013-11-21 05:49:50
【问题描述】:

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

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

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

【问题讨论】:

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

标签: ruby-on-rails ruby ruby-on-rails-3.2 rake seed


【解决方案1】:

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

【讨论】:

  • 太棒了!我只需要将seed_file 替换为filename(已编辑)。
  • 如果有人想知道,internto_sym 的别名。
  • 我收到“不知道如何构建任务 'db:seed:base'”。我已经按照描述完成了,只有我的种子文件被称为 base.rb
  • 它遍历所有文件,但只尝试加载您指定的文件。它是如何做到的还不清楚,因为输入没有作为参数传递,并且没有“if filename == your_passed_filename”来说明这一点。
  • 这对我来说在 Ruby 2.2 和 Rails 4.2.5 上运行良好。只需确保您调用文件custom_seed.rake 而不是custom_seed.rb(答案是正确的,但我还是设法把它弄混了)。
【解决方案2】:

太复杂了! 我只是想要一个简单的任务来执行 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

【讨论】:

  • 这与 rake 任务 db:seed 冲突。我建议更改第 2 行以读取任务种子: :environment do ...
【解决方案3】:

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

【讨论】:

  • 这对我来说非常有效!我对 zeantsoi 的回答也没有任何把握。然而,我删除了 .seeds 扩展名。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多