2012-08-28 3 views
17

Meine Rails App verfügt über einen Website-Crawler, der die Authentifizierungsinformationen lädt, die der Crawler in einem Rails-Initialisierer in config/initializers verwendet. Der Initialisierer lädt die Authentifizierung durch Aufrufen einer Modellmethode im SiteLogin-Modell.Wie überspringe ich das Laden von Rails-Initialisierungen beim Ausführen einer Rake-Aufgabe?

Wenn ich rake db:migrate ausführen, um die SiteLogin Modelltabelle zu erstellen, schlägt es fehl, da der Initialisierer erwartet, dass die Datenbanktabelle bereits vorhanden ist. Ich kann den Code in meinem Initialisierer einfach auskommentieren, die Migration ausführen, um die Tabelle zu erstellen, dann den Initialisierungscode auskommentieren und mich nicht um das Problem kümmern.

Problem ist, ich verwende Capistrano zur Bereitstellung und das würde bedeuten, dass ich zuerst ohne den Initialisierungscode bereitstellen müsste, um die Migration auszuführen, und dann erneut mit dem Initialisierungscode bereitstellen. Gibt es dafür einen besseren Weg oder ist mein Ansatz in diesem Fall völlig falsch?

Hier einiger Beispielcode ist besser zu meinem Fall zu erklären:

# config/initializers/site_crawler_init.rb 
SiteCrawler.setup do |config| 
    config.hostname = "www.example.com" 
end 

# model/site_crawler.rb 
class SiteCrawler 
    ... 
    class << self 
    attr_accessor :configuration 

    def setup 
     self.configuration ||= Configuration.new 
     yield(configuration) 
    end 
    end 

    class Configuration 

    attr_accessor :hostname, :login_credentials 

    def initialize 
     @login_credentials = SiteLogin.admin_user 
     ... 
    end 
    end 
end 

Antwort

18

Sein vielleicht nicht die bessere Lösung, aber Sie können überprüfen, ob die Tabelle vorhanden:

if ActiveRecord::Base.connection.tables.include?('your_table_name') 
    # your code goes here 
end 

Aber seine im Allgemeinen nicht genug, weil es Migrationen geben könnte.

Jetzt können Sie auch überprüfen, ob Sie in einer Harke Aufgabe sind:

if ActiveRecord::Base.connection.tables.include?('your_table_name') and !defined?(::Rake) 
    # your code goes here 
end 

Und es kann immer noch nicht genug sein, wenn Tests starten, weil es in einer Rake-Task ausgeführt werden, so könnten Sie auch Überprüfen Sie, ob die Rails-Umgebung test ist (Rails.env.test?).

8

Ich hatte ein ähnliches Problem, wo ich einen bestimmten Initialisierer überspringen musste (für verzögerte Job, die eine verzögerte Job-Tabelle vorhanden ist), beim Ausführen einer bestimmten Rake-Task - in diesem Fall db: migrieren.

Ich habe folgend meine Rakefile:

def running_tasks 
    @running_tasks ||= Rake.application.top_level_tasks 
end 

def is_running_migration? 
    running_tasks.include?("db:migrate") 
end 

Und dann folgend in meinem problematischen initialiser:

unless defined?(is_running_migration?) && is_running_migration? 
    ... do whatever 
end 
Verwandte Themen