2012-08-28 15 views
17

Aplikacja Moja szyna zawiera przeszukiwacz stron internetowych, który ładuje dane uwierzytelniające używane przez przeszukiwacz w inicjatorze szyn w wersji config/initializers. Program inicjujący ładuje uwierzytelnianie, wywołując metodę modelu w modelu SiteLogin.Jak pominąć ładowanie inicjalizatorów Rails podczas uruchamiania zadania rake?

Po uruchomieniu rake db:migrate w celu utworzenia tabeli modeli SiteLogin nie działa, ponieważ inicjator oczekuje, że tabela bazy danych już istnieje. Mogę po prostu skomentować kod w moim inicjalizatorze, uruchomić migrację, aby utworzyć tabelę, a następnie odkomentować kod inicjalizatora i nie martw się o problem.

Problem polega na tym, że używam Capistrano do wdrożenia, a to oznaczałoby, że będę musiał najpierw wdrożyć bez kodu inicjalizatora, aby uruchomić migrację, a następnie wdrożyć ponownie za pomocą kodu inicjalizatora. Czy istnieje lepszy sposób robienia tego, czy też moje podejście jest całkowicie błędne w tym przypadku.

Oto niektóre przykładowy kod, aby lepiej wyjaśnić moją sprawę:

# 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 

Odpowiedz

18

Its Być może nie jest lepsze rozwiązanie, ale można sprawdzić, czy tabela istnieje:

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

Ale to zazwyczaj nie wystarcza, ponieważ mogą być oczekujące migracje.

Teraz można również sprawdzić, czy jesteś w zadaniu nachylenia:

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

i może być wciąż za mało przy uruchamianiu testów, ponieważ nie są wykonywane zadania natarcia, dzięki czemu może również sprawdź, czy środowisko Railsowe jest testowe (Rails.env.test?).

8

Miałem podobny problem, gdy potrzebowałem pominąć konkretny inicjator (dla pracy opóźnionej, która wymaga obecności tabeli delayed_job), podczas uruchamiania określonego zadania rake - w tym przypadku db: migrate.

I dodaje następujące do mojego Rakefile:

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

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

a potem następnego w moim problematycznej initialiser:

unless defined?(is_running_migration?) && is_running_migration? 
    ... do whatever 
end 
Powiązane problemy