20

현재 ActiveRecord 단일 테이블 상속을 사용하고 있습니다.STI를 사용할 때 ActiveRecord 객체를 다른 클래스로 캐스팅하는 방법은 무엇입니까?

내 모델 중 하나를 A 유형에서 B 유형으로 캐스팅하려면 어떻게해야합니까? 그들에게는 같은 부모가 있습니다.

class C < ActiveRecord::Base 
end 

class A < C 
end 

class B < C 
end 

@a = A.new(...) 
@b = B.new(@a.attr1, @a.attr2, ..., @a.attrN) 
+1

캐스트 할 필요가 없어야합니다. – RubyDubee

답변

40
+0

이제는 사용 중지됩니다. 그 자리를 대신 할 수있는 방법이 있는지 알고 있습니까? http://apidock.com/rails/ActiveRecord/Base/becomes – NatGordon

+3

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method- 나 - 더 이상 사용하지 않게되고 방금 이동했습니다. –

-2

는 A.

뭔가 등을 공유하는 속성의 값을 설정하는 B의 새로운 인스턴스를 생성 컴파일시 확인. 무엇을 성취하려고합니까?

클래스 Dad 및 하위 클래스 SonDaughter이 있다고합시다.

변수 @adad를 가지고 또는 Daughter 개체를 저장하고 그냥 Dad 인 것처럼 처리 할 수 ​​있습니다. 동일한 방법에 응답하는 한 아무런 차이가 없습니다. 이것은 "오리 타이핑"이라고하는 개념입니다.

+3

이것은 주조하지 않습니다 ... 그렇습니까? – RubyDubee

+0

@Webbisshh 아니에요. 이는 질문에서 제기 된 특정 문제에 대한 근사치입니다. – bjg

+2

'become'는 단순히 속성 이상을 복사한다는 점을 제외하고는 이와 같이 구현됩니다. http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method--becomes를보고 소스 코드를 확인하십시오. –

5

당신은 루비가 어떤 유형 -을 수행하지 않기 때문에 캐스팅 할 필요가 없습니다 :

+3

왜이 질문을했는지 정확히 기억하지 않지만 다형성 연관과의 STI 관계가있을 때 필요하다는 것을 잘 기억하고 있습니다. 그렇지 않으면 잘못된'type' 필드로 저장됩니다. – fotanus

+0

그러나 Ruby는 Rails가 아닙니다. https://github.com/rails/rails/blob/1d08b98055508d00844cd30cbb68a4afa38a77a1/activerecord/lib/active_record/errors.rb#L14 –