2012-08-28 40 views
17

我的Rails應用程序有一個網站爬網程序,用於加載爬網程序在config/initializers的rails初始化程序中使用的認證憑證。初始化程序通過在SiteLogin模型中調用模型方法加載認證。如何在運行rake任務時跳過加載Rails初始化程序?

當我運行rake db:migrate來創建SiteLogin模型表時,它失敗了,因爲初始值設定項期望數據庫表已經存在。我可以簡單地在我的初始化程序中註釋掉代碼,運行遷移來創建表,然後取消註釋初始化程序代碼,而不用擔心這個問題。

問題是,我正在使用Capistrano進行部署,這意味着我必須首先部署初始化程序代碼才能運行遷移,然後再使用初始化程序代碼進行部署。有沒有更好的方法來做到這一點,或者在這種情況下我的方法是完全錯誤的。

下面是一些代碼示例,以更好地解釋我的情況:

# 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 

其通常不夠,因爲可能有未決的遷移。

現在,你也可以檢查,如果你在一個rake任務是:,

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

故能仍不足以啓動測試時,因爲有一個rake任務被執行,所以你也可以檢查Rails環境是否正在測試(Rails.env.test?)。

8

我有一個類似的問題,那就是當運行一個特定的rake任務時,我需要跳過一個特定的初始化程序(對於延遲工作,這需要一個delayed_job表),在這個例子中是db:migrate。

添加以下到我的Rake文件:

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 
相關問題