2012-08-28 6 views
17

My rails appには、クローラがレール初期化子で使用する認証資格情報をconfig/initializersにロードするWebサイトクローラがあります。初期化子は、SiteLoginモデルでモデルメソッドを呼び出して認証をロードします。rakeタスクを実行しているときにRailsイニシャライザの読み込みをスキップするにはどうすればよいですか?

SiteLoginモデルテーブルを作成するときにrake db:migrateを実行すると、イニシャライザはデータベーステーブルがすでに存在することを期待しているため失敗します。私は自分のイニシャライザでコードをコメントアウトし、マイグレーションを実行してテーブルを作成し、イニシャライザコードのコメントを外し、問題について心配する必要はありません。

問題は、私が展開するカピストラーノを使用していますし、これは私が初期化コードを再び展開し、移行を実行するために、初期化コードなしで最初に展開する必要があるだろうことを意味する、です。これを行う良い方法はありますか、この場合は私のアプローチが完全に間違っています。

ここでは、より良い私の場合を説明するためのいくつかのサンプルコードです:おそらく

# 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 

答えて

18

そのないよりよい解決策が、テーブルが存在するかどうかをチェックすることができます:

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

しかし、その一般的に十分ではないが、保留中の移行が存在する可能性があるためです。

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

をし、テストを起動したときにそこにはrakeタスクで実行されているので、それは、まだ十分ではない可能性があり、そうあなたもできます

あなたがrakeタスクにいる場合さて、あなたもチェックすることができRails環境がテストかどうかを確認してください(Rails.env.test?)。

8

特定のレーキタスク(この例ではdb:migrate)を実行しているときに、特定のイニシャライザ(遅延ジョブの場合はdelayed_jobテーブルが必要です)をスキップする必要があったのと同様の問題がありました。

私は私のRakefileに以下を追加しました:

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

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

そして、私の問題の初期化子で次

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