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

dm7nw8vv  于 2022-11-04  发布在  Ruby
关注(0)|答案(2)|浏览(129)

我们需要为一些新添加到Rails项目“版本100”的表添加更多的种子数据。
但是,如果我们只是将其添加到 seeds.rb 并重新运行rake db:seed命令,它当然会重新添加原始种子数据,从而复制它。
因此,如果您已经将种子数据添加到seeds.rb中,比如TableOne ...

如何在开发的后期阶段为TableTwo和TableThree增量添加种子数据?

我希望我可以简单地创建一个NEW seeds_two.rb 文件并运行rake db:seeds_two,但这会产生错误Don't know how to build task 'db:seeds_two'
所以看起来只有“seeds.rb”可以使用。

人们如何维护对种子数据的增量添加?

9udxz4iz

9udxz4iz1#

您可以重复使用seed任务,但要使其幂等。
要使种子幂等,只需在执行命令之前检查条件是否存在。例如:是否要创建新的管理员用户?

User.find_or_create_by_username(:username => "admin")

而不是

User.create(:username => "admin")

但是,seed应该在创建项目时用于填充数据库。如果您希望在应用的生命周期中执行复杂的数据播种,只需创建一个新的rake任务,执行它,然后删除它。

ojsjcaue

ojsjcaue2#

对于那些对这个问题有顾虑的人
我们可以在db/seeds/文件夹中有多个种子文件,并且,我们可以编写一个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

      # Now we will create multiple tasks by each file name inside db/seeds directory. 

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

    # This is for if you want to run all seeds inside db/seeds directory
    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

相关问题