私が最初にそれを始めたとき、Railsアプリケーションでマルチテナンシーの多くの例を見つけましたが、私も完全に快適に感じるものを見つけることができませんでした。しかし、私はついに満足のいく解決策を手に入れました。
「スコープ付きマルチテナンシー」レールキャストから始めました
http://railscasts.com/episodes/388-multitenancy-with-scopes
次に、このガイドを使用して、デバイスのサブドメインでマルチテナンシーを機能させる方法を検討しました。
https ://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-into-a-single-subdomain
しかし、私はそれを額面通りに受け止めませんでした。 deviseがそのようにどのように機能したかを本当に理解するために飛び込みました。
それがすべて整ったら、マルチテナントの宝石の準備ができました:
https://github.com/wireframe/multitenant
しかし、私はそこで止まりませんでした。マルチテナントgemでは、適切なスコープを設定する場合は常にMultitenant.with_tenantと言う必要があるため、次のようなTenantControllerを作成しました。
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
次に、テナントによってスコープを設定したいコントローラーは、ApplicationControllerではなくTenantControllerから継承します。そうすれば、コントローラーの詳細について何も覚えておく必要がなく、「うまくいった」のです。開発者が考えなければならなかったのは、「これはテナントデータを処理するコントローラーですか?」
だけでした。これはまだ開発者がいくつかのことを正しく行うことに依存していますが(モデルで「acts_as_multitenant」と言って適切なコントローラーから継承しますが、実際には非常にうまく機能します。