Mysql
 sql >> Database >  >> RDS >> Mysql

Rails l'architettura multi-tenant, l'ambito dell'accesso a più tenant

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.