2013-08-14 4 views
2

복잡한 도메인을 모델링하기 위해 Rails STI를 사용하고 있습니다. 결국 서브 클래스 서브 클래스의 바로 인스턴스에 대한 개별 "인덱스"페이지로 연결되는 링크의 각 레이블을 만들 목적으로레일 STI, 서브 클래스가 사용되지 않는 한 나타나지 않습니까?

> <% StateDescription.subclasses.each do |state_description| %> <li> 
> <%= state_description.to_s %> </li> <% end %> 

: 뷰에서 나는 모든 서브 클래스를 나열하고있다.

이렇게하면 모든 가능한 하위 클래스 목록을 가져 가지 않아도됩니다. (나중에 추가하면 나중에 업데이트됩니다.)

그러나 데이터베이스에서 실제로로드 한 하위 클래스 만 목록에 표시된다는 것을 알고 있습니다. StateDescription.all을 말하면, 모든 기존 서브 클래스가 나타납니다 (그러나 인스턴스가없는 것은 없습니다). 그 대신에 특정 서브 클래스 모두를 요구하면 그 서브 클래스 만 표시됩니다.

이것은 내가 들었던 "게으른로드"의 일부라고 상상해보십시오. 그렇지? 문제가 발생하면 데이터베이스에서 특정 "유형"을 가져 오지 않으면 해당 모델이 있어도 존재하지 않을 수 있습니다.

이 문제를 해결할 수있는 방법이 있습니까? 아니면 내가 만드는 모든 하위 클래스에 대한 링크를 작성해야합니까?

편집 : 콘솔에서

, 나는 다음 StateDescription.all 다음 StateDescription.subclasses을 할 경우

StateDescription.subclasses.count이

내가 0

를 얻을 입력하면 .count, 나는 14가된다.

+0

시도'StateDescription.descendants'은 참조하십시오. 그 방법에 익숙하지 않아 왜 당신의 질문에 직접적으로 대답 할 수는 없지만, 게으른 로딩에 대한 당신의 생각은 옳을 수 있습니다. –

+0

.descendants는 슬프게도 똑같은 동작을합니다. – Jenny

+0

예, 게시 한 후에'# subclasses'가 실제로'# descendants' 메서드를 사용한다는 것을 알았습니다. 그것을 무시하십시오. 내 대답이 전혀 도움이됩니까? –

답변

3

게으른 로딩으로 인해 나타나지 않는 서브 클래스에 대한 가설이 보인다. 올바른지. 응용 프로그램을 개발 모드로 실행하고 있으므로 모든 클래스는 특별히 호출 될 때까지로드되지 않습니다. 프로덕션 환경에서는 모든 것이 한 번에로드되어 캐시되므로이 문제가 발생하지 않습니다. 는 컨트롤러 클래스는 순간로드 있도록 컨트롤러의 상단에이를 넣을 수

[Subclass1, Subclass2, Subclass3] if Rails.env == 'development' 

이 문제를 해결하기 위해

한 가지 방법은, this post에 따르면,이 같은 일을하는 것입니다 로드되거나 이전 필터에 저장됩니다.

+0

생산에 투입하면 문제가 해결된다는 것이 맞습니다! 해결 방법을 찾아 주셔서 감사합니다. – Jenny

+0

나는 기쁘다. 나는 도울 수 있었고, 나는 또한 뭔가를 배웠다. –

0

테스트하지 않았습니다!

 
StateDescription.select("distinct type").map { |sd| Kernel.const_get(sd.type) } 

+0

이 문제는 DB에 레코드가 아직 생성되지 않은 'StateDescription'의 하위 클래스가있는 경우 여전히 여기에 표시되지 않는다는 점에서만 문제가 있습니다. –

0

이 작업을 수행하는 가장 쉬운 방법은 개발 eager_load!입니다. 같은

뭔가 : 그 차이를 만드는 경우

<% Rails.application.eager_load! if Rails.env.development? %> 
<% StateDescription.subclasses.each do |state_description| %> 
    <li><%= state_description.to_s %> </li> 
<% end %>