2010-07-09 1 views
2

열 client_id가 데이터베이스를 통해 유비쿼터스되고 주어진 세션 또는 요청에 대해 우리는 클라이언트의 '컨텍스트'에있게됩니다 시각.Active :: Record로 일부 열에 의해 데이터베이스가 분할 된 것처럼 보이게하는 방법

단순한 데이터베이스 관리를 위해 동일한 테이블에 유지하면서 각 클라이언트의 데이터를 별도의 데이터베이스에 저장하는 방법을 시뮬레이션 할 수 있습니까? 내가 원하는 것은 기본 범위와 유사하지만 모든 요청에 ​​대해 변경되므로로드 타임에 고정 될 수 없습니다.

# invoices table data 
    # ------------------- 
    # id  client_id  amount 
    # 1  1    100.00 
    # 2  2    100.00 
    with_client(Client.find(1)) do 
    Invoices.all  # finds only invoice 1 
    Invoices.find(2) # finds nothing or raises 
    end 

어떻게 액티브하여이 작업을 수행 할 수 있습니다, 또는 어떤 점에서 나는 수술이 동작에 영향을 AR을 바꿀 수 있을까?

추가 포인트 : ID가이 CLIENT_ID 컬럼의 갱신을 방지하기 위해 좋아 - 그것은 멀티 tenanted 응용 프로그램에 대해 설명 프리젠 테이션 here가 만들 시간

+0

이 시나리오에 대한 다른 생각 : http://www.linkedin.com/answers?viewQuestion=&questionID=698205&askerID=3854479 –

+0

이 다른 스택 오버플로 문제도 매우 비슷합니다. http://stackoverflow.com/questions/1603178/rails-best-practice-to-scope-sub-based 하위 도메인 –

답변

0

고정되어야한다. 특히 postgres에 대해 데이터베이스 스키마를 활용하는 데 흥미로운 아이디어가 있습니다.

1
class Client < ActiveRecord::Base 
    has_one :invoice, :dependent => :destroy 
end 

class Invoice < ActiveRecord::Base 
    belongs_to :client 
end 

In controller 

    @client= Client.find(1) 
    @client.invoice #finds id =1  client_id =1 amount=100.0 
+0

이것은 있습니다. 고객이 존재하지 않는다고 가장하지 마라. 모든 것이 클라이언트와 연관되어 있다면, 글 머리 기호를 물고 원하는 때마다'@client.invoice'를 입력하십시오. – Matchu

+0

그것이 XLsuite를 위해 선택한 경로이며, 우리를 위해 잘 해결되었습니다. –

+0

나는 명시적인 해결책을 제시 할 수는 있지만 커튼 뒤에서 작동하여 구성 가능한 방식으로 데이터의 '아파트'를 만드는 무언가를 찾고 있습니다. 주어진 요청 및 가능하면 전체 프로세스가 해당 아파트의 범위에 묶여있을 것입니다. –

관련 문제