4

(这真的是一个关于 Rake & Rails & 依赖的新手问题。试图让我的头脑围绕所有这些如何组合在一起)

基本上,我想要一个 Rake 任务,它的行为类似于 seed.rb 但被单独调用。它为开发环境添加了测试数据,而我的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 开发环境在运行时可用?我不仅要努力完成工作,还要以“正确”的方式去做。

4

2 回答 2

6

解决这个问题的一种方法是在 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

如何创建 rake 任务:

require 'family_seed'

namespace :seed do
  task :families => :environment do
    FamilySeed.seed
  end
end

我会小心让 Family.delete_all 和 Member.delete_all 之类的东西过于自由地使用。稍后,您可以通过在生产数据库上调用您不想要的东西来轻松地击中自己的脚。

如何运行 rake 任务:

在您的命令中运行它,如下所示:

bundle exec rake seed:families
于 2010-12-15T10:42:59.670 回答
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

于 2010-12-15T10:44:57.187 回答