Wie eine Rake Aufgabe einzurichten für Aussaat
-
10-10-2019 - |
Frage
(Dies ist wirklich ein Neuling Frage zu Rake & Rails & Abhängigkeiten im Allgemeinen. Der Versuch, meinen Kopf herum zu wickeln, wie das alles zusammenpasst)
Im Grunde möchte ich eine Rake Aufgabe, wie seed.rb wirkt, sondern separat aufgerufen. Es fügt Testdaten für die Entwicklungsumgebung, während meine seed.rb Grunddaten für alle Umgebungen.
Das Skript, family_seed.rb verwendet factory einige Datensätze zu erzeugen. Es sieht wie folgt aus:
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')
Es läuft gut mit bundle exec "ruby db/family_seeds.rb"
, aber meine Frage ist, wie es mit Rake einzurichten. Sollte das Ganze in einer Rake Aufgabe gestellt werden? Wie könnte ich stattdessen eine Aufgabe einrichten, die die Skript aufrufen würde, während sichergestellt wird, dass die Rails Entwicklungsumgebung zur Verfügung, wenn es läuft? Ich versuche, nicht nur die Arbeit zu erledigen, aber es in einem „richtigen“ Weg zu tun.
Lösung
One way to approach this would be to create a class or module in lib (this makes it easier to write tests for, and makes the code more reusable):
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
How to create the rake task:
require 'family_seed'
namespace :seed do
task :families => :environment do
FamilySeed.seed
end
end
I'd be careful with allowing things like Family.delete_all and Member.delete_all to be too freely used. You could easily shoot yourself in the foot later on by calling something you didn't mean to on a production db.
How to run the rake task:
Run it in your command like with the following:
bundle exec rake seed:families
Andere Tipps
Create a rake task and require :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
After you can run this task rake delete_all