2009-07-15 2 views
0

의 내가 여러 가지 서브 클래스 유지하기 위해 STI 패턴을 사용하고 있다고 가정 해 봅시다 "거래"를레일 : STI 계층 구조에서 클래스의 인스턴스를 저장 유형별로 어떻게 작성합니까? "액티브"을 하위 클래스

내 서브 클래스 테이블 "거래"에 저장합니다 레일 "HighPriorityTransaction"와 "LowPriorityTransaction"를 포함 할 수 있습니다

"유형"열이 있습니다. 각 서브 클래스에는 before_save 콜백의 다른 구현이 있습니다.

클래스의 인스턴스를 유형 문자열 값으로 어떻게 만들 수 있습니까?

나는 combobox에서 유형을 가져 와서 해당 유형을 인스턴스화하고 객체가 다형성을 통해 before_save 콜백을 처리하게한다고 생각하고 있습니다. 이것에 대한 추가 아이디어는 또한 높이 평가 될 것입니다.

감사합니다. 그 접근 방식

type = Kernel.const_get("type_string") 

#which in this case might be 
#type = Kernel.const_get("HighPriorityTransaction") 

transaction = type.new 

답변

0

나는 내가 공유하는 것이라고 생각 하나 개의 솔루션을 발견 당신이 명시 적으로 당신의 컨트롤러에 대해 경계하지 않는 한. 다음은 작동 할 수있는 대안 중 하나입니다. 서브 클래스 이름을 서브 클래스 오브젝트에 맵핑하는 Transaction 클래스에 "registry"속성을 작성합니다.

class Transaction 

    class << self 
    attr_reader :registry 

    def inherited(sub) 
     @registry ||= {} 
     @registry[sub.name] = sub 
    end 
    end 
end 

class HighPriorityTransaction < Transaction; end 

Transaction.registry["HighPriorityTransaction"].new.class # HighPriorityTransaction 
0

하나의 문제는 클라이언트들이 그 이름을 알고 일이면 응용 프로그램의 모든 클래스가 인스턴스화되도록 할 수 있다는 것입니다 :

0

이의 라인을 따라 수 있습니다 당신을 위해 무엇을 찾고 :

@transaction = "HighPriorityTransaction".camelize.constantize.new 
관련 문제