Ondanks dat ik veel voorbeelden van multitenancy in Rails-applicaties vond toen ik het voor het eerst ging doen, kon ik er ook geen vinden waarbij ik me helemaal op mijn gemak voelde. Maar ik heb eindelijk een oplossing waar ik blij mee ben.
Ik ben begonnen met de 'multitenancy with scopes' railscast
http://railscasts.com/episodes/388-multitenancy-with-scopes
heb vervolgens gekeken naar het maken van multi-tenancy werk met het bedenken van subdomeinen met behulp van deze handleiding:
https ://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-into-a-single-subdomain
Maar dat nam ik niet zomaar aan; Ik dook erin om echt te begrijpen hoe devise op die manier werkte.
Toen ik dat allemaal op zijn plaats had, was ik klaar voor het multitenant-pareltje:
https://github.com/wireframe/multitenant
Maar daar bleef ik niet bij. de multitenant-juweel vereist dat je Multitenant.with_tenant zegt wanneer je wilt dat de zaken passend zijn, dus heb ik een TenantController gemaakt die er als volgt uitziet:
around_filter :scope_current_tenant
def scope_current_tenant
begin
Firm.current = Firm.find_by_subdomain!(request.subdomain)
rescue
raise ActionController::RoutingError.new('Not Found')
end
Multitenant.with_tenant Firm.current do
yield
end
ensure
Firm.current = nil
end
end
en vervolgens erft elke controller die ik wil laten vallen door de huurder van TenantController in plaats van ApplicationController. Op die manier hoefde ik niets te onthouden in de details van de controller, het 'werkte gewoon'. het enige waar ontwikkelaars aan moesten denken was 'is dit een controller die gegevens van huurders verwerkt?'
Hoewel dit nog steeds afhankelijk is van het feit dat ontwikkelaars een paar dingen correct doen (overnemen van de juiste controller en 'acts_as_multitenant' in het model zeggen, werkt het in de praktijk heel goed.