2012-06-18 59 views
0

我有一個延遲的作業,它對postgresql中的公共模式運行完美。
我的大部分操作都不過對其他模式(每個客戶端)
延誤工作;它在過濾器之前跳過

處理不同模式我已經按照說明操作,並把代碼切換搜索路徑,在我的before_filter(應用控制器)。

我注意到了。 before_filter中的代碼在典型操作期間被完美調用,但在延遲作業期間完全沒有。

我修剪和修剪了一切,但我能想到的最簡單的事情,以顯示入口。

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    def write_to_log(text) 
    File.open('c:\temp.txt', 'ab') do |f| 
     f.write text + "\r\n" 
     f.close 
    end 
    end 
    before_filter :on_before_filter 
    def on_before_filter 
    write_to_log('hey dave'); 
    return if(use_token() == false); 
    set_active_schema if(goto_log_in? == false); 
    end 

在工人階級

def run_job(id) 
    upload = Upload.find(id) 
    upload.run_job(); 
end 
handle_asynchronously :run_job, :priority => 10, :queue => 'public' 

相當標準的東西的代碼?儘管作業中的代碼運行,但before_filter代碼不會被調用。

所以我的問題是。我做錯什麼了嗎?或者更重要的是,我該如何做對嗎?

+0

爲什麼延遲作業會從您的控制器運行某些內容? –

+0

Humm ..好點..爲什麼數據庫過濾器在控制器中? :)我接受你的觀點..你會在哪裏放置過濾器代碼? – baash05

+0

鑑於current_user不是模型範圍的一部分。在過濾器之前,似乎有一個奇怪的選擇,因爲它永遠不會工作? – baash05

回答

1

我不推薦這種方法;我只是通過提供這個代碼來回答你的問題。由於您基本上希望您的代碼在任何嘗試調用數據庫之前運行,因此您可以猴子修補程序ActiveRecord。下面的代碼添加到config/initializers/active_record_monkey_patch.rb

class ActiveRecord::ConnectionAdapters::ConnectionPool 
    # create an alias for the old 'connection' method 
    alias_method :old_connection, :connection 

    # redefine the 'connection' method 
    def connection 
    # output something just to make sure the monkey patch is working 
    puts "*** custom connection method called ***" 

    # your custom code is here 
    write_to_log('hey dave'); 
    return if(use_token() == false); 
    set_active_schema if(goto_log_in? == false); 

    # call the old 'connection' method 
    old_connection 
    end 

end 

您會看到您的自定義連接方法獲取調用頻繁了,而不會導致控制器工作。您可以通過打開一個rails控制檯並執行任何數據庫查詢來測試它,並且您應該看到多次顯示「自定義連接方法稱爲」消息。

+0

問題在於作業有一堆對數據庫的調用,並且因爲我使用了postgresql示例(使用控制器來更改數據庫),所以我必須將其添加到每個類。 – baash05

+0

那麼你是說你想讓你的方法'on_before_filter'在每次調用任何類方法時自動運行? – lee

+0

這就是你需要做的事情,使用postgres模式。告訴模型你的目標是什麼架構。在應用程序控制器中,在調用數據庫之前調用該應用程序控制器,因此它檢查在所有數據庫讀/寫中選擇了正確的模式。我只是想要在訪問DJ – baash05

0

如果你想操作Postgres的和模式ActiveRecord的搜索路徑,你可以使用一個全功能的寶石狀的公寓:https://github.com/bradrobertson/apartment

您可以切換到一個新的模式:

Apartment::Database.switch('database_name') 

不管你可以在應用程序控制器請求或後臺作業中調用它。

+0

我沒有設置路徑的問題。即使沒有寶石,問題在於切換代碼的​​位置在哪裏?我不想把它放在我的每一項工作中。感謝您的幫助。我會看看寶石。 – baash05