2013-07-18 6 views
2

나는이 STI 구현이 있습니다레일 STI : 예상대로 호출되지 않는 서브 클래스의 방법

class Instruction < ActiveRecord::Base 
    def get_view 
    return "I'm a pseudo abstract base method!" 
    end 
end 

class SCreateWebPage < Instruction 
    def get_view 
    return "I'm doing terribly important things!" 
    end 
end 

나는이 (가) 명령 클래스에 다음과 같은 추가 한 : ======

def self.inherited(child) 
    child.instance_eval do 
     def model_name 
     Instruction.model_name 
     end 
    end 
    super 
    end 

%w(S_create_web_page).each {|r| require_dependency r } if Rails.env.development? 

을 ===

내 데이터베이스 테이블에 유형 열에 서브 클래스 이름을 올바르게 저장하고있는 것으로 보입니다. 서브 클래스가로드되었는지 확인했습니다 :

,
(rdb) Module.const_get("SCreateWebPage") 
SCreateWebPage(id: integer, name: string, code: string, skwerkflow_id: integer, created_at: datetime, updated_at: datetime, factory_id: integer, type: string) 

===========

상기 방법은 get_view Instruction.rb의 생성 방법이라한다. 이 특정 지침 각각은 자신의 견해를 가질 수 있다고 생각합니다. get_view는 메타 프로그래밍 약간 호출 할 수있는 권리보기를 함께 넣어하는 것입니다.

문제 : 나는 명확하게 인스턴스화 서브 클래스로 저장 한 명령에 get_view를 호출 할 때, 그것은 서브 클래스의 메소드를 호출하는 대신 기본 클래스 호출 아니에요 :

[30, 39] in /Users/alexedelstein/dev/skwerl/app/models/instruction.rb 
    30 end 
    31 
    32 #overridden by subclass to help controller find the right class-specific view. 
    33 def get_view 
    34  debugger 
=> 35  return "I'm a pseudo abstract base method!" 
    36  return nil 
    37 end 
    38 
    39 debugger 
(rdb:13) self 
#<Instruction id: 87, name: "Create Web Page", code: nil, skwerkflow_id: 38, created_at: "2013-07-18 01:00:40", updated_at: "2013-07-18 01:00:40", factory_id: nil, type: "SCreateWebPage"> 

를 ====== ========

이 숨어 년 후 스택 오버플로 내 첫 포스팅은, 그래서 나를 부드럽게 아름다움을 빼앗다하시기 바랍니다. 건배.

+0

어떻게 개체를 만드는을? 데이터베이스에서 다시로드하면됩니다. –

답변

5

출력을 보면 명령어 인스턴스에서 메소드를 호출하는 것처럼 보입니다. 모든 SCreateWebPage 인스턴스 조작법 인스턴스는 그들이 인스턴스는 관계없이 유형 항목 값 지시 할 수있다. 그래서 당신은 두 번 확인해야 당신이 SCreateWebPage.find (ID)을 수행하고있다되지 Instruction.find (ID).

은 가끔 유형에 대해 걱정하지 위해 추상적 인 방법에 #becomes를 사용하고 추가 쿼리를 수행 할 수 없습니다 :

class Instruction 
    def get_view 
    self.becomes(self.type.constantize).get_view 
    end 
end 
+0

"가"의 사용은 완벽하게 해결합니다. 고맙습니다. –