Как установить задачу грабли для посева
-
10-10-2019 - |
Вопрос
(Это действительно вопрос новичка о Rable & Rails & Deperiancess в целом. Попытка обернуть мою голову вокруг того, как все это соединяется вместе)
По сути, я хочу задачу граблей, которая действует как Seed.RB, но называется отдельно. Он добавляет тестовые данные для среды разработки, в то время как My 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"
, но мой вопрос в том, как установить его с помощью граблей. Следует ли все это быть помещено в задачу грабли? Как вместо этого я мог создать задачу, которая бы вызвала сценарий, обеспечивая при этом среду разработки Rails, когда она работает? Я стараюсь не просто выполнить работу, но и сделать это «правильным».
Решение
Одним из способов приблизиться к этому будет создание класса или модуля в 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, чтобы быть слишком свободно использованными. Вы можете легко выстрелить себя в ногу позже, позвонив на то, что вы не хотели на производственном DB.
Как запустить задачу грабли:
Запустите его в своей команде, как со следующим:
bundle exec rake seed:families
Другие советы
Создайте задачу грабли и требуется: среда
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