【问题标题】:Rails recommended way to add sample dataRails 推荐的添加示例数据的方法
【发布时间】:2017-11-16 08:13:50
【问题描述】:

我有一个类似于下面的 Rake 脚本,但我想知道是否有更有效的方法来执行此操作,而无需删除数据库、运行所有迁移、重新设置数据库然后添加示例数据?

namespace :db do

  desc 'Fill database with sample data'
  task populate: :environment do
    purge_database
    create_researchers
    create_organisations
    add_survey_groups_to_organisations
    add_members_to_survey_groups
    create_survey_responses_for_members

  end
end


    def purge_database
      puts 'about to drop and recreate database'
      system('rake db:drop')
      puts 'database dropped'
      system('rake db:create')
      system('rake db:migrate')
      system('rake db:seed')
      puts 'Database recreated...'
    end

    def create_researchers
      10.times do
        researcher = User.new
        researcher.email = Faker::Internet.email
        researcher.save!
      end
    end

【问题讨论】:

  • 这适用于您的测试环境吗?
  • 这是给开发环境的

标签: ruby-on-rails


【解决方案1】:

您应该通过db:seed 将示例数据填充到您的数据库中。这不是种子文件的目的。

db:seed 用于您的应用需要以运行的初始数据。它不是用于测试和/或开发目的。

我要做的是让一个任务填充样本数据,另一个任务是删除数据库、创建数据库、迁移、播种和填充。很酷的是它由其他任务组成,因此您不必在任何地方复制代码:

# lib/tasks/sample_data.rake
namespace :db do
  desc 'Drop, create, migrate, seed and populate sample data'
  task prepare: [:drop, :create, "schema:load", :seed, :populate_sample_data] do
    puts 'Ready to go!'
  end

  desc 'Populates the database with sample data'
  task populate_sample_data: :environment do
    10.times { User.create!(email: Faker::Internet.email) }
  end
end

【讨论】:

  • 这应该是公认的答案:种子与任务
  • @agis 如果我这样做,是否有一些 ActiveRecord 属性会丢失的原因?见stackoverflow.com/questions/44381014/…
  • 这应该是 schema:load 代替 migrate。每次重新启动数据库时都不应该重新运行迁移,这就是 db/schema.rb 的用途。官方指南:guides.rubyonrails.org/…
【解决方案2】:

我建议让rake db:seed 自给自足。我的意思是,您应该能够多次运行它而不会造成任何损坏,同时确保加载您需要加载的任何样本数据。

因此,对于您的研究,db:seed 任务应该执行以下操作:

User.destroy_all
10.times do
  researcher = User.new
  researcher.email = Faker::Internet.email
  researcher.save!
end

您可以一遍又一遍地运行此程序,并确保您最终会得到 10 个随机用户。

我看到这是为了开发。在那种情况下,我不会把它放在 db:seed 中,因为它可能会在生产中运行。但是你可以把它放在一个类似的 rake 任务中,你可以根据需要随时重新运行。

【讨论】:

  • db:seed 不是用示例数据填充数据库的正确方法。
猜你喜欢
  • 1970-01-01
  • 2016-05-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2017-02-06
  • 2021-10-30
相关资源
最近更新 更多