我们需要为一些新添加的表添加更多的种子数据到我们的rails项目的“100版”。
但是,如果我们只是将它添加到seeds.rb并重新运行rake db:seed命令,它当然会重新添加原始种子数据,重复它。
因此,如果你已经将种子数据添加到了seed.rb中,例如,TableOne ......我们如何在开发的后期阶段逐步添加TableTwo和TableThree的种子数据?
我希望我可以简单地创建一个新的seeds_two.rb文件并运行rake db:seeds_two
,但这会导致错误Don't know how to build task 'db:seeds_two'
所以看起来只能使用“seeds.rb” - 那么人们如何维持种子数据的增量添加呢?
答案 0 :(得分:11)
您可以重复使用seed
任务,但可以idempotent。
要使种子具有幂等性,只需在执行命令之前检查条件是否存在。例如:您想创建一个新的管理员用户吗?
User.find_or_create_by_username(:username => "admin")
而不是
User.create(:username => "admin")
但是,在创建项目时,应使用seed
填充数据库。如果您想在应用程序的生命周期中执行复杂的数据播种,只需创建一个新的rake任务,执行它然后将其删除。
答案 1 :(得分:0)
对于那些对此问题有疑问的人
我们可以在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
然后,为了运行特定的种子文件,您只需运行
rake db:seed:seed_file_name
要按顺序运行该db/seeds
文件夹中的所有种子文件,请在命令下运行
rake db:seed:all