chciałbym się was poradzić odnośnie uzywania aplikacji railsowej z wieloma bazami danych.
Mam 5 serwisów, które wymagają logowania / rejestracj itp - uzyłem do tego celów gemu devise, przyszła potrzeba by uzytkownik zapisany w jedynm serwisie jednocześnie był uzytkownikiem drugiego serwisu. Wpadłem na pomysł że mozna by bylo tabele users i pochodne wrzucic do innej bazy a serwisy mogly by uzywac innego polaczenia do bazy np. przy wyciaganiu usera zas przy innych operacjach standardowego. Moje pytanie brzmi czy to ma sens jeśli tak to jak pogodzić to w railsach, jeśli nie ma sensu to jakie proponujecie inne rozwiązanie ?
Jest to możliwe, ale ma pewne konkretne wady(które czasami mogę być zaletami). Najpierw jak: kluczem jest tu metoda establish_connection oras zmienna klasowa abstract_class
Definiujemy najpierw klasy odpowiadające za połączenia
[code]class UserConnection < ActiveRecord::Base
self.abstract_class = true
establish_connection “user_#{Rails.env}” # user_developmenr user_production etc.
end
class ModelConnection < ActiveRecord::Base
self.abstract_class = true
establish_connection Rails.env
end[/code]
W ten sposób ustanawiamy dokładnie 3 połączenia, (z tym że będziemy używać 2), teraz każdy model w bazie A dziedziczy z UserConnection a każdy model z bazy B dziedziczy z ModelConenction i wszystko bangla.
Wady:
a) transakcje nie działają tak jakbyś się spodziewał.
b) rekord A może zostać zapisany do bazy A, po czym powiązany rekord B rzuci wyjątek przy zapisywaniu, jak będą w jednej bazie A nie zostanie zapisany, gdy będą w 2 bazach, tak nie będzie - rekord A zostanie zapisany mimo że ActiveRecord będzie myślał że nie został.
c) Nie będą działać join-y (ale będą działać includes)
d) kilka dziwnych błędów, czasami relacje pomiędzy połączeniami zachowują się zabawnie.
Zalety - właściwie tylko jedna - wadę (b) możemy wykorzystać do logowania do bazy danych. Dla modelu logującego ustalamy osobne połączenie - i wtedy nawet jeżeli w trakcie transakcji pójdzie rollback, dane zostaną zapisane do logów, mimo że w połączeniu głównym transakcja została wycofana.
Jest kilka gotowych rozwiązań z kategori Single Sign-On (dobra fraza do gugla), zdaje się że Devise ma rozszerzenia do kilku z nich. Ewentualnie OpenID.