2011-06-25 12 views
8

Mam aplikacje Rails 3, które używają różnych baz danych w zależności od poddomeny. Robię to za pomocą "ustalenia połączenia" w ApplicationController.Jak wymusić delayed_job na użycie określonego połączenia db?

Teraz próbuję użyć klejnotu delayed_job, aby wykonać pewne przetwarzanie w tle, jednak korzysta z połączenia z bazą danych, które jest aktywne w tym momencie. Łączy się z bazą danych subdomeny.

Chciałbym zmusić go do korzystania z "wspólnej" bazy danych. Zrobiłem to dla niektórych modeli nazywających "ustanowienie połączenia" w modelu takim jak ten:

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

Każdy pomysł, jak mogę to zrobić?

+0

Występuje dokładnie ten sam problem. Chciałbym odpowiedzi. BTW, JAG, czego używasz do wykonywania wielotynowych baz poddomeny? Pracujemy nad klejnotem i chcielibyśmy trochę dodać. –

+0

Zrobiłem własne, ponieważ nie znalazłem niczego odpowiedniego dla moich potrzeb. Zasadniczo mam "setup_subdomain" before_filter, który przełącza się do odpowiedniego DB. Chciałbym sprawdzić twój klejnot, dowolny link? – JAG

+0

Prawdopodobnie zmodyfikuj klej lateed_job, jeśli jest on na Githubie, to jedyny sposób i dołącz go za pomocą: git => w twoim gemfile. –

Odpowiedz

17

Oto, co powinieneś wiedzieć. Gdy umieścisz klej DelayedJob w swojej aplikacji, utworzysz dla niego migrację, aby utworzyć tabelę, w której przechowywane są zadania, ale nie tworzysz modelu. Jest tak dlatego, że DelayedJob ma już model zawarty w klejnocie (tj. Delayed::Job). To, co musisz zrobić, to załatać ten model nieco, tak jak zrobiłeś to z własnymi modelami. Możesz to zrobić w inicjalizatorze.

Być może masz już inicjalizator do konfiguracji DelayedJob, jeśli możesz to zrobić w tym miejscu, jeśli nie, musisz go utworzyć. Tak, stwórz inicjator (w config/initializers), jeśli nie masz, nazwijmy go delayed_job_config.rb teraz dodać do niego następujące:

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

Robiliśmy do modelu DelayedJob samo ci do twoich własnych modeli. Teraz DelayedJob użyje tego połączenia do umieszczenia zadań w DB.

+0

Minęło trochę czasu, odkąd to opublikowałeś, ale nie mogę w ogóle działać? Zrobiłem dokładnie tak, jak powiedziałeś powyżej, zrestartowałem mój serwer sieciowy, ale DJ wciąż trzyma prace w bazie danych mojego obecnego środowiska, a nie to, co określiłem w moim pliku konfiguracyjnym. Nie mam pojęcia, jak to debugować. –

+1

Odpowiedź jest trochę niejasna, myślę, ale ta linia 'ustanowienie_połączenia ActiveRecord :: Base.configurations [" # {Rails.env} "]' sprawi, że opóźnione zadanie będzie zgodne z bieżącym środowiskiem, jak to by było domyślnie, musisz zastąpić 'Rails.env' dowolnie wybranym połączeniem z bazą danych, np 'establish_connection ActiveRecord :: Base.configurations [" common "]' – skorks

+0

Argh, popełnił błąd ucznia. Dzięki. –

Powiązane problemy