Как настроить Rake-задачу для посева - PullRequest
4 голосов
/ 15 декабря 2010

(Это действительно новый вопрос о 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 при его запуске?Я пытаюсь не просто выполнить работу, а сделать ее «правильно».

Ответы [ 2 ]

5 голосов
/ 15 декабря 2010

Одним из способов решения этой проблемы является создание класса или модуля в 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
2 голосов
/ 15 декабря 2010

Создать грабли и требовать: среда

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

...