2011-06-25 38 views
8

Tôi có một ứng dụng Rails 3 sử dụng các cơ sở dữ liệu khác nhau tùy thuộc vào tên miền phụ. Tôi làm điều này bằng cách sử dụng "establish_connection" trong ApplicationController.Tôi có thể buộc delay_job sử dụng kết nối db cụ thể như thế nào?

Bây giờ tôi đang cố gắng sử dụng đá quý delay_job để thực hiện một số xử lý nền, tuy nhiên nó sử dụng kết nối cơ sở dữ liệu mà nó đang hoạt động trong thời điểm đó. Nó đang kết nối với cơ sở dữ liệu tên miền phụ.

Tôi muốn ép buộc sử dụng cơ sở dữ liệu "chung". Tôi đã thực hiện việc này cho một số kiểu gọi là "establish_connection" trong mô hình như sau:

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

Bất kỳ ý tưởng nào tôi có thể làm điều này?

+0

Chúng tôi đang gặp sự cố tương tự. Rất thích một phản ứng. BTW, JAG, bạn đang làm gì để làm multitenancy dựa trên tên miền phụ? Chúng tôi đang làm việc trên một viên ngọc và sẽ yêu một số đầu vào. –

+0

Tôi đã cuộn của riêng mình vì tôi không tìm thấy bất cứ điều gì phù hợp với nhu cầu của tôi. Về cơ bản tôi có một 'setup_subdomain' before_filter mà chuyển sang DB thích hợp. Tôi rất muốn kiểm tra đá quý của bạn, bất kỳ liên kết? – JAG

+0

Có thể sửa đổi đá quý delay_job, nếu nó trên Github là cách duy nhất và bao gồm nó bằng cách sử dụng: git => trong gemfile của bạn. –

Trả lời

17

Dưới đây là những điều bạn cần biết. Khi bạn bao gồm đá quý DelayedJob trong ứng dụng của bạn, bạn tạo một di chuyển cho nó để tạo bảng nơi các công việc được lưu trữ, nhưng bạn không tạo ra một mô hình. Điều này là do DelayedJob đã có một mô hình được bao gồm trong đá quý (ví dụ: Delayed::Job). Những gì bạn cần làm là vá mô hình này một chút, giống như bạn đã làm với các mô hình của riêng bạn. Bạn có thể làm điều này trong một initializer.

Bạn có thể đã có bộ khởi tạo để định cấu hình DelayedJob, nếu bạn có thể thực hiện việc này trong đó, nếu không bạn cần tạo một tài khoản. Vì vậy, tạo initializer của bạn (trong config/initializers) nếu bạn không có một, chúng tôi sẽ gọi nó là delayed_job_config.rb, bây giờ thêm dòng sau vào nó:

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

Chúng tôi đã thực hiện để mô hình DelayedJob điều tương tự bạn đã làm cho các mô hình của riêng bạn. Bây giờ DelayedJob sẽ sử dụng kết nối đó để đặt các công việc trong DB.

+0

Đã một thời gian kể từ khi bạn đăng bài này nhưng tôi không thể làm việc này ở tất cả? Tôi đã làm chính xác như bạn đã nói ở trên, khởi động lại máy chủ web của tôi, nhưng DJ vẫn giữ các công việc trong cơ sở dữ liệu của môi trường hiện tại của tôi, thay vì những gì tôi đã chỉ định trong tập tin cấu hình của tôi. Không có ý tưởng làm thế nào để gỡ lỗi nó. –

+1

Câu trả lời là một chút không rõ ràng tôi đoán, nhưng dòng này 'setup_connection ActiveRecord :: Base.configurations [" # {Rails.env} "]' sẽ làm cho công việc trì hoãn của bạn chỉ theo môi trường hiện tại của bạn, như nó sẽ làm theo mặc định, bạn cần thay thế 'Rails.env' bằng bất kỳ kết nối cơ sở dữ liệu nào bạn thực sự muốn 'setup_connection ActiveRecord :: Base.configurations [" common "]' – skorks

+0

Argh, mắc lỗi học sinh. Cảm ơn. –

Các vấn đề liên quan