2011-03-14 2 views
0

우리는 method_missing을 사용하여 직렬화 된 해시에서 속성을로드합니다.레일 method_missing 및 activerecord 클래스 캐싱

model = { :name => 'name', 
      :options => { :title => 'title', 
         :custom_field => 'field1', 
         :custom_field => 'field2' } } 

과의 제거 다운 버전 우리 method_missing (이 옵션이 허용 옵션이 발견되지 않는 경우는 물론 슈퍼를 호출되어 있는지 확인하기 위해 다른 물건을 수행) : 예를 들어, 모델을 제공 :

def method_missing(method, *args) 
    self.options[method] 
end 

다음 속성이 개발 환경에서 model.custom_field

를 사용하여 입수하고,이 "정의되지 않은 메서드 'custom_field'"를 첫 페이지로드하지만 후속 페이지로드 오류가 밖으로 작동합니다.

저는 이것이 activerecord 클래스 캐싱에 관한 문제라고 읽었습니다.하지만 이전에 어디에서 보았는지 찾는 데 문제가 있습니다.

이 문제를 해결할 수있는 알려진 방법이 있습니까?

답변

0

self.options이 아닌 대신 인스턴스 변수를 사용하여 해시를 저장하고 그 값을 반환하십시오.

def method_missing(method, *args) 
    return @serialized_hash[method] if @serialized_hash.include?(method) 
    super 
end 

는 그것은 레일의 클래스를 캐시하는 액티브 아니다. 프로덕션 환경에서 그렇게합니다. 개발 중에는 요청할 때마다 모델이 다시로드되므로 이전 요청에서 수행 한 모든 런타임 수정 사항을 덮어 씁니다.

관련 문제