Wie

2010-12-15 8 views
3

eine Rake-Aufgabe für die Aussaat einzurichten (Dies ist wirklich ein Neuling Frage zu Rake & Rails & im allgemeinen Abhängigkeit. Der Versuch, meinen Kopf herum zu wickeln, wie das alles zusammen paßt)Wie

Grundsätzlich ist einen Rake will Aufgabe, die sich wie seed.rb verhält, aber separat aufgerufen wird. Es fügt Testdaten für die Entwicklungsumgebung hinzu, während meine seed.rb grundlegende Daten für alle Umgebungen bereitstellt.

Das Skript family_seed.rb verwendet FactoryGirl, um einige Datensätze zu generieren. 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. Soll das Ganze in eine Rake-Aufgabe gestellt werden? Wie kann ich stattdessen eine Aufgabe einrichten, die das Skript aufruft, während sichergestellt wird, dass die Rails-Entwicklungsumgebung bei der Ausführung verfügbar ist? Ich versuche nicht nur, den Job zu erledigen, sondern es auch "richtig" zu machen.

Antwort

5

Ein Weg, um diesen Ansatz wäre, eine Klasse oder ein Modul in lib zu erstellen (das macht es einfacher für Tests zu schreiben, und macht den Code wiederverwendbar):

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 

Dann eine Rechen-Aufgabe erstellen solche wie:

require 'family_seed' 

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

würde ich mit so dass Dinge wie Family.delete_all und Member.delete_all werden auch frei genutzt vorsichtig sein. Sie könnten sich später leicht in den Fuß schießen, indem Sie etwas, was Sie nicht wollten, in einer Produktions-DB anrufen.

+0

laufen kann, das eine ausgezeichnete Warnung ist! Gibt es eine Möglichkeit sicherzustellen, dass eine Aufgabe nur in einer bestimmten Umgebung ausgeführt wird? Kann das Objekt wie die Klasse FamilySeed die Umgebung prüfen, um zu sehen, ob es Test oder Produktion ist? –

+0

Ich habe den Code aktualisiert, um eine Ausnahme auszulösen, wenn die Schiene env Produktion ist. – idlefingers

2

eine Harke Aufgabe erstellen und benötigen: Umwelt

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 

Nachdem Sie diese Aufgabe rake delete_all

+1

Dies ist gut, um zu zeigen, wie man alles in einer Aufgabe erledigt. Der Schlüssel, den ich vermisste, ist ... =>: environment bit. Ich mag die "delete_all" als den Namen der Aufgabe - macht es weniger wahrscheinlich, es aus Versehen zu starten. –