2011-11-24 5 views
1

업데이트 : 런타임에 일부 모델의 기본 범위를 설정하고 있습니다.이 범위는 내 개발 환경에서 로컬로 작동하며 내 코드는 아래에 나와 있습니다.기본 범위 지정 혼동

 
SET_OF_MODELS = [Event, Group, User] 
 
@account = Account.find_by_subdomain(account_subdomain) 
SET_OF_MODELS.each { |m| m.set_default_scope(@account.id) } 
 
def set_default_scope(account_id) 
default_scope :conditions=> { :account_id => account_id } 
end 

내가 @ account2 대신 계정 1 사용자 @ 다음 User.first 반환 account2 @으로 코드를 반복하면 반면에 내가 계정 1 사용자 @, 말의 @의 계정 1로 User.first 반환 루비 콘솔에서이 코드를 실행하면 . 그리고이 문제는 로컬 서버에서 스테이징 서버에서 앱을 실행하는 동안에는 드러나지 않습니다.

실제로 캐싱되었지만 확실하지 않은 경우 내 생각은 그들의 주를 향한 것입니다. 누군가 깊이있게 설명 할 수 있습니까? 사전

+0

더 일반적인 방법으로 @ account.user를 사용하지 않는 이유는 무엇입니까? – suweller

답변

0

위의 코드에는 아무런 문제가 없지만 사용 된 서버, 즉 씬 서버에 문제가있었습니다. 얇은 것을 잡종으로 바꾼 후에도 완벽하게 작동했습니다. 나는 thin이 응용 프로그램을 로딩 한 후를 제외하고는 set_default_scope를 두 번 이상 실행할 수 없다고 생각한다.

1

default_scope

덕분에 동급 상태를 저장합니다. 그것은 경쟁 환경으로 이어지기 때문에 병행 환경에서 해로울 수 있습니다. 따라서 요청간에 범위 상태를 분리해야합니다.

당신은 당신이 개발 생산 다르다 with_account_scope(account_id)

+0

당신의 노력에 감사드립니다 @ ShiningRay. 당신이 말할 수있는 버그는 여전히 확신 할 수 없지만, 위의 코드는 개발 및 프로덕션 환경에서는 작동하지만 env에서는 준비되지 않습니다. : – a5his

1

같은 클래스 메소드에 .send(:with_scope, opts)를 리팩토링 할 수 around_filter

class ApplicationController < ActionController::Base 
    around_filter :set_default_scope 
    def set_default_scope 
    @account = Account.find_by_subdomain(account_subdomain) 
    opts = :condition => {:account_id => @account.id} 
    Event.send(:with_scope, opts) do 
     Group.send(:with_scope, opts) do 
     User.send(:with_scope, opts) do 
      yield 
     end 
     end 
    end 
    end 
end 

를 사용할 수 있습니다. 프로덕션 환경에서는 모든 클래스가 한 번로드되어 캐시되므로 각 요청에서 기본 범위를 다시 정의 할 수 없습니다. 개발 중에는 쉽게 개발할 수 있도록 각 요청에 클래스가로드됩니다. 코드에서 수행하는 각각의 변경 사항은 다음 요청시 표시되거나 활성화됩니다.

정말로 원한다면 프로덕션 환경에서이 동작을 비활성화 할 수 있습니다. 이렇게하면 사이트 전체가 느려지지만 실제로는 문제가되지 않을 수 있습니다. 이 기능을 끄려면, 당신이 편집하여 config/environments/production.rb을 가지고

config.cache_classes = true 

을 포함하는 행을 찾아 false에 그 전환합니다.

희망이 도움이됩니다.

+0

고마워요 @ nathanvda,하지만 기본 범위를 재정의하고 개발 및 생산하지만 준비가 아니라에서 작동하고 이것은 cache.clb에 cache_classes가 true로 설정되어 있기 때문에 정말 이상합니다. 이것에 대한 제안? – a5his

+0

' false'? – nathanvda

+0

아니요 아직 시도하지는 않았지만 준비에서 false를 설정하면 준비 문제가 해결되지만 기본 범위를 'cache_classes'가 true 인 상태로 프로덕션에서 어떻게 작동하는지 계산 하시겠습니까? – a5his