Как настроить задачу Rake для раздачи

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


person Mike Blyth    schedule 15.12.2010    source источник


Ответы (2)


Один из способов приблизиться к этому — создать класс или модуль в 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. Вы можете легко выстрелить себе в ногу позже, вызвав что-то, что вы не хотели делать в производственной базе данных.

Как запустить задачу rake:

Запустите его в своей команде, как показано ниже:

bundle exec rake seed:families
person idlefingers    schedule 15.12.2010
comment
Это отличное предупреждение! Есть ли способ гарантировать, что задача выполняется только в данной среде? Может ли такой объект, как класс FamilySeed, проверять среду, чтобы определить, является ли она тестовой или рабочей? - person Mike Blyth; 15.12.2010
comment
Я обновил код, чтобы вызвать исключение, если среда rails является рабочей. - person idlefingers; 15.12.2010
comment
@idlefingers спасибо за вашу задачу rake - как мне вызвать ее из командной строки? - person BKSpurgeon; 26.10.2018
comment
@BKSpurgeon, вы сможете запустить его в командной строке с помощью чего-то вроде bundle exec rake seed:families - person idlefingers; 30.10.2018

Создайте задачу 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

person shingara    schedule 15.12.2010
comment
Это хорошо для того, чтобы показать, как сделать все это в одной задаче. Ключ, который мне не хватало, это бит ... =› :environment. Мне нравится delete_all в качестве имени задачи — это снижает вероятность ее случайного запуска. - person Mike Blyth; 15.12.2010