2

そこで、Rails 3.2.11 を使用してマルチテナント Rails アプリケーションに取り組んでいます。スキーマ アプローチを選択したため、単一の Postgres データベースを使用しています。サブドメインに基づいて正しいスキーマがロードされます。独自のスキーマ内のデータにアクセスする権限のみを持つスキーマごとにデータベース ユーザーを作成することで、データベース側にセキュリティを追加しました。

サブドメインをチェックし、適切なデータベース接続を確立するためのすべてのコードはbefore_filter、アプリケーション コントローラー内のメソッド内にあります。

私の方法は単に変更しsearch_path、次を使用しActiveRecord::Base.establish_connectionてデータベースのユーザー名とパスワードを変更します。

いくつかのテストを作成し、アプリを調べて、すべてが適切に機能し、データが適切なスキーマに保存されることを確認しました (同時に複数のサブドメインを使用している場合でも)。

しかし、私が質問したい2つの大きな懸念があります。

  1. 現在、そのActiveRecord::Base.establish_connection呼び出しを使用してデータベース接続を確立しています。その結果、database.yml ファイルからすべてのコードを削除しただけで、すべてが正常に動作します。しかし...私は以前にそのようなことをしたことがありません.これを行うより正しい方法はありますか? これにより何らかのバグが発生する可能性があるのではないかと心配しています..

  2. 前述したようにbefore_filter、適切なデータベース接続を確立するためにメソッドが呼び出されます。しかし、前述のように を使用しているbefore_filterため、ユーザーがページを変更するたびに接続が再確立されます。特にアプリケーションが大きくなるにつれて、これがパフォーマンスの問題を引き起こす可能性があることを懸念しています。また、何かを見落としているかどうかもわかりません。これにより、予期しないバグが発生する可能性があります。誰もこれについて経験があり、これを処理する方法についてアドバイスを提供できますか? おそらく、適切な初期データベース接続が確立されている場合は、サブドメインが変更されない限り接続を再確立しないというコードを追加する方法がありますか?

ありがとう。

4

1 に答える 1

2

これはあなたに役立つかもしれません: https://github.com/influitive/apartment

Rails 3 と ActiveRecord のマルチテナンシー

Apartment は、Rails アプリケーションで複数のデータベースを処理するのに役立つツールを提供します。アカウントまたは会社に基づいて特定のデータを隔離する必要があるが、一部のデータを共通のデータベースに存在させる必要がある場合は、Apartment が役立ちます。

また、SO にはマルチテナンシーに関する質問がたくさんあります。チェックしてみてください。

于 2013-12-05T06:39:48.590 に答える