그래서 요즘 단일 테이블 상속에보고되었으며,이 일반적인 질문/답변을 발견 :레일 - 단일 테이블 상속 - 잘못된 캐스트 방법?
질문 : 당신은 알파 베타 < 가정, 베타 알파에서 개체
obj
의 클래스를 변경 어떻게 , STI에서?답변 : 루비는 오리 형 언어이므로 캐스팅을 사용하지 않습니다. 그러나 당신이 할 필요가 "유형"변수를 "베타"를 설정하고 개체를 저장하고, 다음 번에 당신은 형 베타 될 것입니다 알파 개체를로드한다 : 그러나,이
obj = Alpha.new obj.save #now obj is of type Alpha obj.type = "Beta" obj.save #now obj is of type Beta
을 접근 방식이 나를 위해 작동하지 않는 것 같습니다. obj는 올바르게 저장되지만 Beta 객체로는 작동하지 않습니다. 베타 유효성 검사를 실행하지 않고 저장하고 obj.respond_to?(:beta_method) #beta_method being a method in the beta class
을 검사하면 false를 반환합니다. 이 방법이 효과가 없습니까? 올바른 접근 방법이 있습니까? 아니면 단순히 뭔가 잘못하고있는 것입니까? (: beta_method) (: beta_method) (참 Alpha.last와 베타 모두 반환 Beta.last.respond_to가하면서, 거짓 반환
편집
나는 Alpha.last.respond_to을했을 때 것을 발견했다. 마지막으로 동일한 객체가 반환되었습니다. 재미있는 개발? 아직도 누군가가 이것을 자세히 설명 할 수 있다면 (루비가 상속을 처리하는 방법과 관련하여) 그것은 굉장 할 것입니다.
나는이 대답이 옳다고 생각하지 않습니다. OP에서,'obj.type = "Beta"; obj.save'는 DB를 업데이트하지만 메모리 내 버전은 Alpha로 타입 변환됩니다. 'obj.reload'를하는 것은 Rails가 알파가되기를 기대하기 때문에이 경우에는 작동하지 않습니다. obj2 = Beta.find (obj.id)' –
...하지만 더 나은 점은 @Teoulas가 설명하는대로'obj.becomes (Beta) '를 사용하는 것입니다. –
나는 데이터베이스가 업데이트되지 않았다는 것을 결코 암시하지 않았다. 내가 말했던 것은 타입을 "베타"로 바꾸면 루비는 신경 쓰지 않는다 (여전히 알파의 인스턴스를 가지고있다). 다음 단락에서 말했듯이 ActiveRecord가 데이터베이스에서 레코드를 새로 검색 할 때 베타 인스턴스가 생성됩니다. (나는 원래 게시물에서 #comomes에 대해 언급하지 않은 이유를 기억하지 못한다.하지만 당신이 말한 것처럼, 다른 누군가는 그것을 가져왔다.) –