10

我已经为测试 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

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

4

2 回答 2

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)。您还可以使用像种子库这样的 gem ,它为您提供环境特定的种子文件以及 Rails 中已有的一些其他附加内容。

于 2013-04-03T13:31:50.860 回答
0

@Gene您即将解决这个难题。我认为你离这个只有一条路。我没有使用 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。

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

于 2015-03-12T20:49:22.937 回答