【问题标题】:How to use FactoryGirl factories to build a development database?如何使用FactoryGirl工厂建立开发数据库?
【发布时间】:2013-04-03 02:12:52
【问题描述】:

我已经为测试 Rails 项目构建了一些精心制作的 FactoryGirl 工厂定义,为此它们运行良好。

我现在想对脚本(Ruby、Rake 等等)使用相同的定义,以使用大量有效、正确关联的记录来填充 Rails 开发数据库。

我确定这是一项常见任务,但找不到有用的参考。

什么是最佳实践?如何进行?

假设工厂在spec/factories.rb。接下来是什么?谢谢。

更新

还在挣扎。将此作为rake 任务进行了尝试。

require 'factory_girl'
require 'spec/factories'

namespace :db do
  desc "Fill database with trial data"
  task :populate => :environment do
    Rake::Task['db:reset'].invoke
    50.times do |n|
      # Make a consistent set of related records.
      team = FactoryGirl.create(:team, :completed)
      team.members << FactoryGirl.create(:member)
      FactoryGirl.create(:design, :team => team)
    end
  end
end

唉,这找不到我的factories.rb

rake aborted!
cannot load such file -- spec/factories

在其他任何地方,项目根相关的 require 路径都可以正常工作。什么是秘密握手?

【问题讨论】:

  • 这通常是种子文件的工作。您是否有不想使用种子来填充数据库的原因?
  • 从未听说过种子。请问可以提供参考吗? (大多数时候学习 Rails 就像是在寻宝......)
  • @ChrisSchmitz 非常感谢。这看起来更像是用于安装应用程序运行所需的基础数据,而不是仅提供一些记录以检查实施策略是否有效,这是我的目的。但我会研究它。
  • 您有没有偶然将gem factory_girl 放在group test 中?如果是这样,它也必须处于开发阶段,才能像你想要的那样使用它。

标签: ruby-on-rails development-environment factory-bot


【解决方案1】:

正如我在评论中提到的,这通常是种子数据的工作。如果您希望仅将这些数据植入您的开发数据库,​​您可以通过执行以下操作来修改seed Rake 任务:

namespace :db do
  task :seed => :environment do
    env_seed_file = File.join(Rails.root, 'db', 'seeds', "#{Rails.env}.rb")
    load(env_seed_file) if File.exist?(env_seed_file)
  end
end

这将使您能够为每个环境创建一个文件(即 db/seeds/development.rb)。您还可以使用像 seedbank 这样的 gem,它为您提供环境特定的种子文件以及 Rails 中已有的一些其他附加内容。

【讨论】:

  • 谢谢。正如您所说,在seeds.rb 文件中,我拥有require 的完整环境加载路径,因此FactoryGirl 和我的工厂defs 工作正常。我只是将我的代码包装在if Rails.env == 'development' 中,以确保它不会在非开发数据库中生成随机记录。如果以后出现更复杂的需求,我会使用你更通用的解决方案。
  • 我刚刚在查看如何使用 factory_girl 生成测试数据时找到了这个答案。播种数据库通常根本不用于将测试数据添加到数据库中,而是用于在开发和生产中播种初始记录。 (见herehere
【解决方案2】:

@基因 你已经接近解决这个难题了。我认为你离这个只有一条路。 我没有使用 RSpecs,路径可能会略有不同,但您大致了解。

namespace :db do
  desc "Fill database with trial data"
  task :populate => :environment do
    require 'factory_girl'
    require Rails.root + 'spec/factories'

    Rake::Task['db:reset'].invoke
    Rake::Task['db:seed'].invoke
    50.times do |n|
      # Make a consistent set of related records.
      team = FactoryGirl.create(:team, :completed)
      team.members << FactoryGirl.create(:member)
      FactoryGirl.create(:design, :team => team)
    end
  end
end

我只为您提供所需工厂文件的精确路径,并在您重置后添加 rake db:seed。

数据库种子不是在开发时填充您的数据库,而是使用适当的信息引导您的新应用程序以便能够正常工作。 IE。创建管理员用户和默认状态

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多