Trots att jag hittade många exempel på multitenancy i Rails-applikationer när jag först gav mig i kast med det, kunde jag inte hitta något som fick mig att känna mig helt bekväm heller. Men jag har äntligen en lösning som jag är nöjd med.
Jag började med 'multitenancy with scopes' railscast
http://railscasts.com/episodes/388-multitenancy-with-scopes
tittade sedan på att få flera hyresrätter att fungera med devise underdomäner med hjälp av den här guiden:
https ://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-into-a-single-subdomain
Men jag tog det inte för nominellt värde; Jag dök in för att verkligen förstå hur utformning fungerade på det sättet.
När jag hade allt det på plats var jag redo för multitenant-pärlan:
https://github.com/wireframe/multitenant
Men jag stannade inte där. multitenant-pärlan kräver att du säger Multitenant.with_tenant när du vill att saker och ting ska vara lämpliga, så jag skapade en TenantController som ser ut så här:
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
och sedan alla kontroller jag vill ska omfattas av hyresgästen ärver från TenantController snarare än ApplicationController. På så sätt behövde jag inte komma ihåg något i kontrollernas detaljer, det "bara fungerade". det enda utvecklare behövde tänka på var "är det här en kontrollant som hanterar hyresgästdata?"
Även om detta fortfarande beror på att utvecklare gör några saker korrekt (ärver från rätt kontroller, säger "agerar_som_multitenant" i modellen, men det fungerar väldigt bra i praktiken.