我已经为测试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
项目根目录相关的其他任何地方都需要路径正常工作。什么是秘密握手?
答案 0 :(得分: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中已有的其他一些内容。
答案 1 :(得分:0)
@Gene 你很接近解决这个难题。我认为你离这个只有一条路。 我没有使用RSpec,路径可能略有不同,但你有了一般的想法。
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。
数据库种子不是在开发时填充数据库,而是使用适当的信息引导新应用程序以便能够正常工作。即。创建管理员用户和默认状态