Nonostante abbia trovato molti esempi di multitenancy nelle applicazioni Rails quando ho deciso di farlo per la prima volta, non sono riuscito a trovarne nemmeno uno che mi facesse sentire completamente a mio agio. Ma finalmente ho una soluzione di cui sono felice.
Ho iniziato con il railscast "multitenancy con ambiti"
http://railscasts.com/episodes/388-multitenancy-with-scopes
quindi ho esaminato il funzionamento multi-tenancy con i sottodomini devise utilizzando questa guida:
https ://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-into-a-single-subdomain
Ma non l'ho preso alla lettera; Mi sono tuffato per capire davvero come l'espediente ha funzionato in quel modo.
Una volta che avevo tutto a posto, ero pronto per la gemma multi-tenant:
https://github.com/wireframe/multitenant
Ma non mi sono fermato qui. la gemma multitenant richiede che tu dica Multitenant.with_tenant ogni volta che vuoi che le cose abbiano un ambito appropriato, quindi ho creato un TenantController che assomiglia a questo:
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
e quindi qualsiasi controller che voglio essere compreso nell'ambito del tenant eredita da TenantController anziché da ApplicationController. In questo modo non dovevo ricordare nulla nei dettagli del controller, "funzionava". l'unica cosa a cui gli sviluppatori dovevano pensare era "questo è un controller che gestisce i dati del tenant?"
Anche se questo dipende ancora dagli sviluppatori che fanno alcune cose correttamente (ereditando dal controller giusto, dicendo "acts_as_multitenant" nel modello, nella pratica funziona davvero bene.