1

이것은 길기 때문에 당신이 나와 함께 있기를 바랍니다.레일 STI 미스테리 - 왜 유형이 클래스에서 클래스로 변경 되었습니까?

저는 MrUpdate와 TriggeredUpdate라는 두 개의 서브 클래스로 구성된 Update라는 모델을 가지고 있습니다. 단일 테이블 상속을 사용하여 유형 필드를 업데이트 할 문자열로 추가했습니다.

내 견해로는 어떤 유형을 표시할지 결정하는 것입니다. 나는 형식은 문자열이기 때문에, 나는 업데이트가 MrUpdate 일 때 즉, false로 평가,

<% if @update.type == 'MrUpdate' %> 

이 실패해야 가정한다. 이 시점에서 @ update.type.type이 Class임을 알았습니다. 업데이트가 MrUdpate 일 때, 즉 비교가 true로 평가,

<% if @update.type == MrUpdate %> 

그것은 일 : OK, 무엇이든, 내가 생각, 그래서 그것을 변경되었습니다. 그런 다음 다시 내보기에서 아래쪽으로 내려 놓았고 다시 실패했습니다 (즉, 업데이트가 MrUpdate 일 때 false로 평가됨).

두 번째 원인은 < % = link_to ... %> 내가 사용하고 jQuery로 버튼을 만드는 호출. 내가보기에이 코드를 넣을 경우 :

<br> 
<%= @update.type.type %><br> 
<%= @update.type %><br> 

<%= link_to 'New Note', new_note_path(:update_id => @update.id), :class => "ui-button" %> 

<br> 
<%= @update.type.type %><br> 
<%= @update.type %><br> 

내가 볼 것은 :

Class 
MrUpdate 

(the New Note button) 

String 
MrUpdate 

그것은 문자열로 클래스에서 변경입니다! 그래서 내가 도대체 ​​내가 잘못했거나 누락 된 것일까? 왜 그렇게해야 link_to? 왜 처음에는 문자열이 아니지만 왜 그것이 바뀌는 지에 관해서는 혼란 스럽다는 것이 명확하지 않습니다 ...?!? 도움이나 설명이 도움이 될 것입니다. 나는 그것을 맨 위와 다른 방법으로 코딩 할 수 있습니다. 그러나 그런 식으로 광기가 있습니다. 왜 이런 일이 일어나는지 이해해야합니다.

+1

'type'은 예약어의 일종이라고 생각하지 않습니까? – fl00r

+0

예,이 용도로 예약되어 있습니다.MrUpdate와 TriggeredUpdate를 Update에서 파생시키고 Update에 유형 필드를 추가하는 것은 내가 읽은 것에서 단일 테이블 상속을 수행하는 방법입니다. –

답변

1

문제점이 무엇인지 알아 냈습니다. 길을 가리키며 fl00r에게 감사드립니다.

예, 타입은 호출 한 객체의 클래스를 알려주는 Ruby 1.8.7에 예약되어 있습니다. 그러나 Rails에서 단일 테이블의 경계를 표시하고 서브 클래스의 각 인스턴스의 클래스 이름을 저장하는 데 사용되는 필드의 이름이 사실이기도합니다.

그래서 @ update.type을 사용하여 유형 필드 값에 액세스하려고 시도했습니다. 그러나 이것이 Ruby에서 Object 클래스의 type 메소드를 호출하는 것이 었습니다. 어떤 이유로 든 link_to 호출 후에 업데이트 테이블의 유형 필드 값에 액세스했습니다.

이것을 알아 내려고하면서 레일즈 콘솔에서 @ update.type을 호출하고 "warning : Object # type is deprecated; Object # class"라는 메시지를 보았습니다. 마침내 내가했던 일이 등록되었습니다. 전화를 다음과 같이 변경했습니다.

<% if @update.class == MrUpdate %> 

모든 것이 예상대로 작동합니다. Google을 통해 STI에 관한 페이지에서 유형을 확인하는 전화를 본 적이 없습니다. 이것은 모두 한 명의 컨트롤러 만 사용하는 것이 좋음에도 불구하고 때로는 보유한 인스턴스의 클래스를 결정해야하는 경우도 있습니다.

그래서 실수로 파일럿 오류가 발생했습니다. 하지만 어쩌면이 일이 다른 사람을 도울 것입니다.

관련 문제