2012-01-13 3 views
0

내 문제
우리는 중소기업을위한 로컬 호스팅 웹 응용 프로그램을 개발하고 있습니다. 또한 잠재 고객이 제품을 평가할 수있는 데모 사이트가 있습니다. 현재 데모 사이트를 사용하는 모든 고객은 동일한 데이터에 액세스 할 수 있습니다. 다른 사용자의 배후에서 수정 작업을 수행 할 수 있기 때문에 이상적이지 않습니다. 이로 인해 앱이 눈치 챘을 때 '불안정'하다고 느낄 수 있습니다. 각 고객에게 자신의 경험을 향상시키기위한 데이터 하위 세트를 제공하고 싶습니다. 모든 모델에 user_id 열을 추가하는 것은 쉽지만, 이제 모든 쿼리가이 새로운 연결을 사용하는지 확인해야합니다.
내가 손으로 통과하고 @people = current_user.people하지만 절름발이에 @people = Person.all 같은 전화를 바꿀 수 내 문제 해결의around_filter를 사용하여 Rails의 모든 쿼리를 범위 지정하는 방법은 무엇입니까?

하드 방법! 마스터 브랜치에서 개발이 계속되고 있으며, 데모 지점으로 병합 할 때 모든 쿼리를 돌보지 않아도됩니다.

것은 내가 대신 할 싶습니다 무엇 내 쿼리를 잡고과 같이 범위 지정이 추가 레이어에 추가 할 것입니다 내 application_controller에 around_filter 생성 할 싶습니다
:

around_filter :scope_on_current_user 

def scope_on_current_user(&block) 
    MagicalClass.scope_on_user(current_user, &bock) 
end

을 이것은 데이터베이스 샤딩 보석 인 octopus에서 얻은 아이디어입니다. 나는 그들의 소스 코드를 둘러 보았고 꽤 털이 보였다. 그들은 꽤 많이 ActiveRecord에 깊숙히 들어가고, DB 연결을 하이재킹합니다. 나는 그것이 내가 원하는 것에 대해 과잉이라고 생각합니다. MagicalClass의 작동 방법에 대한 조언이 있으십니까? :)

레일 3.1.0
액티브 3.1.0

답변

0

가 기본 범위가 발동 see here for details을 할 수 있도록 패치가 있으며,이 패치/보석의 지금은하지 않고 작동 할 수 있습니다.

Thread.current과 결합하면이 될 수 있습니다.

그렇다면 별도의 DB로 멀티 테넌트 (multi-tenant) 방식을 취하는 것이 더 합리적일까요?

+0

Thread.current !!! 그것이 내가 필요한 것입니다. 나는 현재 사용자/세션과 모델 코드 사이의 차이를 어떻게 뛰어 넘을 수 있는지 알 수 없었다. 고마워. – muirbot

+0

@muirbot 그래, 내가 모델에 섞여있는 쓰레드가 얼마나 편한 지 잘 모르겠지만, 현재 코드를 수정하지 않고도 AR 내부 구조를 왜곡시키지 않고 (만약 당신이 행동의 지속 기간 동안 만해라.) 나는 다른 옵션들이 무엇이 될지 모르겠다. 나는 정말로 좋아하는 것을 만들 수 없었다 : –

관련 문제