sql >> Base de Datos >  >> RDS >> Mysql

Rails arquitectura multiinquilino, acceso de alcance a múltiples inquilinos

A pesar de encontrar muchos ejemplos de multiusuario en aplicaciones Rails cuando me propuse hacerlo por primera vez, tampoco pude encontrar uno que me hiciera sentir completamente cómodo. Pero finalmente tengo una solución con la que estoy contento.

Empecé con el Railscast 'multitenancy with scopes'

http://railscasts.com/episodes/388-multitenancy-with-scopes

luego analizó cómo hacer que la tenencia múltiple funcione con subdominios de diseño usando esta guía:

https ://github.com/plataformatec/devise/wiki/How-To:--Aislar-usuarios-para-iniciar sesión-en-un-único-subdominio

Pero no lo tomé al pie de la letra; Me sumergí para comprender realmente cómo funcionaba Devise de esa manera.

Una vez que tuve todo eso en su lugar, estaba listo para la gema multiusuario:

https://github.com/wireframe/multitenant

Pero no me detuve ahí. la gema multiinquilino requiere que diga Multitenant.with_tenant siempre que desee que las cosas tengan un alcance apropiado, por lo que creé un TenantController que se ve así:

  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

y luego cualquier controlador que quiera que el inquilino tenga en el ámbito hereda de TenantController en lugar de ApplicationController. De esa manera, no tuve que recordar nada en los detalles del controlador, "simplemente funcionó". lo único en lo que los desarrolladores tenían que pensar era en '¿es este un controlador que maneja datos de inquilinos?'

Si bien esto todavía depende de que los desarrolladores hagan algunas cosas correctamente (heredando del controlador correcto, diciendo 'acts_as_multitenant' en el modelo, funciona muy bien en la práctica.