(这实际上是一个关于Rake& Rails&依赖性的新手问题。试图将我们的所有这些结合在一起)
基本上,我想要一个像seed.rb一样的Rake任务,但需要单独调用。它为开发环境添加了测试数据,而我的seed.rb为所有环境提供了基本数据。
脚本family_seed.rb使用FactoryGirl生成一些记录。它看起来像这样:
require File.expand_path('../../config/environment', __FILE__)
require './spec/factories'
Family.delete_all
Member.delete_all
zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500')
blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501')
它与bundle exec "ruby db/family_seeds.rb"
运行良好,但我的问题是如何使用Rake进行设置。整个事情应该放在Rake任务中吗?相反,我怎样才能设置一个可以调用脚本的任务,同时确保Rails开发环境在运行时可用?我不仅仅是为了完成工作,而是以“正确”的方式完成工作。
答案 0 :(得分:5)
解决这个问题的一种方法是在lib中创建一个类或模块(这样可以更轻松地编写测试,并使代码更具可重用性):
require '../spec/factories'
class FamilySeed
def self.seed
raise "Don't run this in production!" if Rails.env.production?
Family.delete_all
Member.delete_all
zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500')
blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501')
end
end
require 'family_seed'
namespace :seed do
task :families => :environment do
FamilySeed.seed
end
end
我要小心允许像Family.delete_all和Member.delete_all这样的东西过于自由使用。稍后你可以通过在生产数据库中调用你不想要的东西来轻松地射击自己。
在您的命令中运行它,如下所示:
bundle exec rake seed:families
答案 1 :(得分:2)
创建rake任务并要求:environment
task :delete_all => :environement do
require Rails.root.join('spec/factories')
Family.delete_all
Member.delete_all
zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500')
blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501')
end
您可以运行此任务rake delete_all