2013-04-03 25 views
8

我已经为测试Rails项目建立了一些精心设计的FactoryGirl工厂定义,为此他们工作得很好。如何使用FactoryGirl工厂构建开发数据库?

我现在想用一个脚本(红宝石,耙,无论...)有大集合的有效的,正确的相关记录来填充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 

在其他地方一个项目根目录相对路径需要工作正常。什么是秘密握手?

+1

这通常是种子文件的工作。是否有理由不想使用种子填充数据库? –

+0

从未听说过种子。你能提供一个参考吗? (大部分时间学习Rails看起来像是寻找清道夫...) – Gene

+1

@Gene http://railscasts.com/episodes/179-seed-data –

回答

1

正如我在我的评论中提到,这是典型的种子数据的工作。

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:如果你想在这个数据只被接种到开发数据库,​​你可以通过做这样的事情修改seed Rake任务/seeds/development.rb)。您还可以使用像seedbank这样的宝石,它可以为您提供环境特定的种子文件以及Rails中已有内容的一些其他补充。

+0

谢谢。正如你所说的,在'seeds.rb'文件中,我有完整的环境加载路径,因此FactoryGirl和我的工厂可以正常工作。我只是将代码封装在'if Rails.env =='development''中,以确保它不会在非开发数据库中生成随机记录。如果出现更复杂的要求,我会在稍后使用更一般的解决方案。 – Gene

+0

我只是在找到如何用factory_girl生成测试数据时找到了这个答案。为数据库添加测试数据通常不用于播种数据库,而是在开发和生产中播种初始记录。 (见[这里](http://railscasts.com/episodes/179-seed-data?view=asciicast)和[这里](http://www.xyzpub.com/en/ruby-on-rails/3.2 /seed_rb.html)) –

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 

我只精确您需要的工厂文件路径,我还加了耙分贝:您复位后的种子。

的DB的种子是不是能够让你在数据库开发时间,但引导用正确的信息,新的应用程序能够正常工作。即。创建管理用户和默认状态

相关问题