Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Rails mandantenfähige Architektur, die den Zugriff auf mehrere Mandanten ermöglicht

Obwohl ich viele Beispiele für Mandantenfähigkeit in Rails-Anwendungen fand, als ich mich zum ersten Mal damit beschäftigte, konnte ich auch keines finden, bei dem ich mich vollkommen wohl fühlte. Aber ich habe endlich eine Lösung, mit der ich zufrieden bin.

Begonnen habe ich mit dem Railscast „Mandantenfähigkeit mit Scopes“

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

Dann haben wir uns angesehen, wie man Mandantenfähigkeit mit Devise-Subdomains mithilfe dieser Anleitung zum Laufen bringt:

https ://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-in-to-a-single-subdomain

Aber ich habe das nicht für bare Münze genommen; Ich habe mich vertieft, um wirklich zu verstehen, wie Devise so funktioniert.

Nachdem ich all das eingerichtet hatte, war ich bereit für das mandantenfähige Juwel:

https://github.com/wireframe/multitenant

Aber ich habe hier nicht aufgehört. Das Multitenant-Gem erfordert, dass Sie Multitenant.with_tenant sagen, wann immer Sie möchten, dass der Bereich angemessen ist, also habe ich einen TenantController erstellt, der so aussieht:

  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

und dann erbt jeder Controller, den ich vom Mandanten erfassen möchte, eher von TenantController als von ApplicationController. Auf diese Weise musste ich mir an die Details des Controllers nichts merken, es funktionierte einfach. Das Einzige, woran Entwickler denken mussten, war:„Ist das ein Controller, der Mandantendaten verarbeitet?“

Dies hängt zwar immer noch davon ab, dass Entwickler ein paar Dinge richtig machen (vom richtigen Controller erben und im Modell „acts_as_multitenant“ sagen, aber in der Praxis funktioniert es wirklich gut.