2011-06-25 89 views
8

我有一個Rails 3應用程序根據子域使用不同的數據庫。我通過在ApplicationController中使用「establish_connection」來做到這一點。如何強制delayed_job使用特定的數據庫連接?

現在我正在嘗試使用delayed_job gem做一些後臺處理,但是它使用的數據庫連接在當時處於活動狀態。它連接到子域數據庫。

我想強制它使用「通用」數據庫。我在模型中這樣做了一段模型調用「establish_connection」:

class Customer < ActiveRecord::Base 
    establish_connection ActiveRecord::Base.configurations["#{Rails.env}"] 
    ... 
end 

任何想法,我該怎麼辦呢?

+0

我們遇到了完全相同的問題。會喜歡迴應。順便說一句,JAG,你用什麼來做基於子域的多租戶?我們正在研究一個寶石,並會喜歡一些輸入。 –

+0

我推出了自己的產品,因爲我沒有找到適合自己需求的東西。基本上我有一個'setup_subdomain'before_filter切換到適當的數據庫。我很想看看你的寶石,任何鏈接? – JAG

+0

可能修改delayed_job gem,如果它在Github上是唯一的方法並將它包含在您的gemfile中,請使用:git =>。 –

回答

17

這是你需要知道的。當您在應用程序中添加DelayedJob gem時,將爲其創建一個遷移以創建存儲作業的表格,但不會創建模型。這是因爲DelayedJob已經有一個包含在寶石中的模型(即Delayed::Job)。你需要做的是稍微修補這個模型,就像你用自己的模型做的一樣。你可以在初始化器中做到這一點。

您可能已經有一個初始化程序來配置DelayedJob,如果是這樣,您可以在那裏做到這一點,如果不是你需要創建一個。因此,創建初始化(在config/initializers),如果你沒有一個,我們把它叫做delayed_job_config.rb,現在添加以下代碼行:

Delayed::Job.class_eval do 
    establish_connection ActiveRecord::Base.configurations["#{Rails.env}"] 
end 

我們所做的DelayedJob模型同樣的事情你做你自己的模特。現在DelayedJob將使用該連接將作業放入數據庫。

+0

過了一段時間,因爲你發佈了這個,但我不能得到這個工作呢?我完全按照上面所說的完成了,重新啓動了我的Web服務器,但DJ仍然將作業粘貼在當前環境的數據庫中,而不是我在配置文件中指定的內容。不知道如何調試它。 –

+1

我猜這個答案有點不清楚,但是這行'establish_connection ActiveRecord :: Base.configurations [「#{Rails.env}」]'會讓你的延遲工作跟隨你當前的環境,就像它默認的那樣,你需要用你想要的任何數據庫連接來替換'Rails.env' 'establish_connection ActiveRecord :: Base.configurations [「common」]' – skorks

+0

Argh,犯了一個小學生錯誤。謝謝。 –

相關問題