Apesar de encontrar muitos exemplos de multitenancy em aplicações Rails quando comecei a fazê-lo, também não consegui encontrar um que me deixasse completamente confortável. Mas finalmente tenho uma solução com a qual estou feliz.
Comecei com o railscast 'multilocação com escopos'
http://railscasts.com/episodes/388-multitenancy-with-scopes
em seguida, analisamos como fazer a multilocação funcionar com subdomínios devise usando este guia:
https ://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-into-a-single-subdomain
Mas eu não levei isso ao pé da letra; Eu mergulhei para realmente entender como o devise funcionava dessa maneira.
Uma vez que eu tinha tudo isso no lugar, eu estava pronto para a joia multitenant:
https://github.com/wireframe/multitenant
Mas não parei por aí. a gem multitenant requer que você diga Multitenant.with_tenant sempre que quiser que as coisas tenham o escopo apropriado, então criei um TenantController que se parece com isso:
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, em seguida, qualquer controlador que eu queira ter como escopo o inquilino herda de TenantController em vez de ApplicationController. Dessa forma, não precisei lembrar de nada nos detalhes do controlador, ele 'simplesmente funcionou'. a única coisa que os desenvolvedores tiveram que pensar foi 'este é um controlador que está lidando com dados de locatários?'
Embora isso ainda dependa de desenvolvedores fazendo algumas coisas corretamente (herdar do controlador certo, dizendo 'acts_as_multitenant' no modelo, funciona muito bem na prática.