Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Arquitetura multilocatário do Rails, com escopo de acesso a vários inquilinos


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.