2016-09-02 2 views
0

세 개의 데이터베이스에서 동일한 뷰 집합이 10 개 정도 있습니다. 이러한 뷰에는 데이터베이스의 사용자, 객체 등이 포함됩니다. 나는 사용자 세션을 기반으로 데이터베이스 연결을 변경할 수 있기를 원합니다. 즉, 사용자가 로그인하여 작업 할 세 개의 데이터베이스 중 하나를 선택하면 뷰에 대한 모델이 적절한 연결을 사용합니다.세션 정보를 기반으로 데이터베이스를 전환

저는 이것을 코딩하는 최선의 방법을 고민하고 있습니다. 여러 명의 사용자가 동시에 응용 프로그램을 사용하는 경우 모델에 3 개의 연결 풀 (각 데이터베이스 당 하나씩)을 유지해야한다고 생각합니다. 나는 확신 할 수 없다. 내가 알아낼 수없는 것은 모델이 특정 연결을 사용하도록 강제 할 수있는 방법이다. 찾기와 세션에서 그 정보를 전달하는 방법.

전체적으로이 접근법에 대한 의견이 있으십니까? 뭔가 더 좋아 졌니?

+0

대신 세 개의 데이터베이스 중 하나에 대해 구성된 세 개의 인스턴스를 실행 한 다음 사용자가 작업하고자하는 하위 도메인 (예 : 하위 도메인)으로 선택적으로 리디렉션 하시겠습니까? – 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 개의 데이터베이스에 데이터를 저장합니다.

나는 그 접근법을 전적으로지지한다고 확신하지 못합니다. 일반 사용자를 공유하는 세 개의 개별 응용 프로그램이 있고 그 각도에서 접근하는 것이 더 나을 것 같은 느낌입니다. 이 세 가지 동일한 데이터베이스에 얼마나 많은 앱이 의존하는지, 그리고 사용자와 함께 얼마나 많은 정보가 포함되어 있는지 알지 못하면 말하기가 어렵습니다. https://github.com/thiagopradi/octopus

내가 세션에서 데이터베이스를 저장하고 내 검색의 각 전에 using 방법을 사용하십시오

관련 문제