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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top