2016-09-02 19 views
0

3つのデータベースで同一のビューが10個以上あります。これらのビューには、データベースのユーザー、オブジェクトなどが含まれます。私はユーザーセッションに基づいてデータベース接続を変更できるようにしたいと思います。言い換えれば、ユーザーはログインし、3つのデータベースのうちどれを使用したいかを選択し、ビューのモデルは適切な接続を使用します。セッション情報に基づいてデータベースを切り替える

私はこれをコード化するのに最善を尽くしています。複数のユーザーが同時にアプリケーションを使用していると、私のモデルで3つの接続プール(各データベースに1つずつ)を保持する必要があると考えられます。私はそれを持っていると確信していますが、どのモデルが特定の接続を使用するように強制することはできますか?とセッションからその情報を渡す方法。

このアプローチ全体について考えてみましょうか?何か良いことがありますか?

+0

代わりに、3つのインスタンスを実行し、3つのデータベースのいずれかを設定し、ユーザーが作業したい3つのサブディレクトリ(サブドメインなど)にリダイレクトすることを検討しましたか? – coreyward

+0

私は、唯一の問題は、変更を保存することです。私は上記に言及しなかったが、ユーザーは関係の変更を要求することができるだろう。私は必然的に "データベースAでこれらの変更をリクエストしましたが、なぜデータベースBに再度リクエストする必要があるのですか?" – Dave

+0

あなたはこの電子書籍を[Ryan Bigg](http://stackoverflow.com/users/15245/ryan-bigg)で読むことができます:https://leanpub.com/multi-tenancy-rails-2 @ryanbigg – coreyward

答えて

0

この宝石は銀の弾丸でした。

0

ご使用のモデルでThread.currentメソッドとconnectionメソッドをオーバーライドすると、いくらかのマイレージが出る可能性があります。お使いのモデルに続いて

before_filter :set_target_db 

def set_target_db 
    Thread.current[:target_database] = session[:the_db_they_chose] 
end 

def self.connection 
    case Thread.current[:target_database] 
    when :first_db 
     # Return connection from first pool 
    when :second_db 
     # Return connection from second pool 
    end 
end 

は明らかにあなたはすべてのモデルでそのコードを共有することができ、ユーザーが自分のセッションでそれを持っているとき

あなたはThread.currentにターゲット・データベースを設定することができますこれらのデータベースは、切り替える3つのデータベースにデータを格納します。

私はそのアプローチを完全に支持しているかどうかはわかりません。一般ユーザーを共有する3つの別々のアプリケーションがあり、その角度からアプローチするほうが良いかもしれないように、ちょっと聞こえます。これらの3つの同一のデータベースに依存するアプリの量と、ユーザーの横にどれだけ含まれているかを知らなくても、言うことは難しいです。 https://github.com/thiagopradi/octopus

私はセッションでデータベースを保存し、ちょうど私の検索の各前usingメソッドを使用します。

関連する問題