2012-05-09 3 views
1

다양한 도메인에서 작동하는 레일 3 사이트를 보유하고 있으며 내 모델 중 하나에서 _set_table_name을 사용하여 요청중인 도메인을 기반으로 테이블 이름을 동적으로 변경하려고합니다. 이것이 가능한가?레일즈 - 도메인에 따른 모델의 set_table_name

답변

0

set_table_name은 (는) table_name=입니다. 이 테스트되지 않은 코드입니다

SomeModel.table_name = request.subdomain=='foo' ? 'foos' : 'bars' 
+0

이 스레드는 안전한가요? 두 개의 하위 도메인이 동시에 두 개의 스레드에 충돌하는 것처럼 보이면이 모델은 두 테이블 사이에서 table_name을 공유하게됩니다. – Forrest

+0

그게 내가 알고 싶어하는거야. 누구나 대답 있어요? 내 생각 엔 thread-safe가 될 것입니다.하지만 그것은 단지 추측입니다. –

+0

스레드로부터 안전 할 수있는 방법이 없습니다. 이 메소드는 클래스마다 (클래스로드 시간에) 한 번씩 사용되며, 요청마다 동적으로 사용되지 않습니다. –

0

참고하지만 내가 레일의 "곡물과 함께"더 생각하는 개념이고, 그것은 그 중요한 배포 스레드 안전해야 : 그것을 사용하십시오.

class SomeModel 
    def self.subdomain_class(subdomain) 
    @subdomain_classes ||= {} 
    unless @subdomain_classes[subdomain] 
     @subdomain_classes[subdomain] ||= Class.new(self) 
     @subdomain_classes[subdomain].table_name = "#{self.table_name}_#{subdomain}" # This needs sanitizing, of course 
    end 

    @subdomain_classes[subdomain] 
    end 
end 

class SomeModelsController 
    ... 

    private 
    def CurrentSomeModel 
    SomeModel.subdomain_class(request.subdomain) 
    end 
end 
관련 문제