有没有办法有多个seeds.rb文件?种子数据的任何'版本化'?

jpw*_*ynn 6 ruby rake ruby-on-rails

我们需要为一些新添加的表添加更多的种子数据到我们的rails项目的"100版".

但是,如果我们只是将它添加到seeds.rb并重新运行rake db:seed命令,它当然会重新添加原始种子数据,复制它.

因此,如果您已经将种子数据添加到seeds.rb中,例如,TableOne ...我们如何在开发的后期阶段逐步添加TableTwo和TableThree的种子数据?

我希望我可以简单地创建一个新的seeds_two.rb文件并运行,rake db:seeds_two但这给了一个错误Don't know how to build task 'db:seeds_two'

所以它看起来只能使用"seeds.rb" - 那么人们如何保持种子数据的增量添加?

Sim*_*tti 11

您可以重复使用该seed任务,但要使其具有幂等性.

要使种子具有幂等性,只需在执行命令之前检查条件是否存在.例如:您想创建一个新的管理员用户吗?

User.find_or_create_by_username(:username => "admin")
Run Code Online (Sandbox Code Playgroud)

代替

User.create(:username => "admin")
Run Code Online (Sandbox Code Playgroud)

但是,seed应该在创建项目时使用填充数据库.如果要在应用程序的生命周期中执行复杂的数据播种,只需创建一个新的rake任务,执行它然后将其删除.

  • 很好的答案,谢谢.此外,我学到了一个很酷的新词,我可以在派对上使用("我希望热巧克力圣代的卡路里是幂等的");)但我确实有一个问题......你如何处理你的项目发展的情况,您添加新字段,因此需要新的种子数据进入这些新字段?耙?还是种子? (3认同)

quy*_*tdc 8

对于那些对这个问题有疑虑的人

我们可以在db/seeds/文件夹中有多个种子文件,并且我们可以编写一个 rake 任务来运行我们想要运行的单独文件

# lib/tasks/custom_seed.rake
# lib/tasks/custom_seed.rake
namespace :db do
  namespace :seed do

    Dir[File.join(Rails.root, 'db', 'seeds', '*.rb')].each do |filename|
      task_name = File.basename(filename, '.rb').intern

      task task_name => :environment do
        load(filename)
      end
    end

    task :all => :environment do
      Dir[File.join(Rails.root, 'db', 'seeds', '*.rb')].sort.each do |filename|
        load(filename)
      end
    end

  end
end
Run Code Online (Sandbox Code Playgroud)

然后,为了运行特定的种子文件,你可以运行

rake db:seed:seed_file_name
Run Code Online (Sandbox Code Playgroud)

要在该db/seeds文件夹中按顺序运行所有种子文件,请运行以下命令

rake db:seed:all
Run Code Online (Sandbox Code Playgroud)