2009-08-18 1 views
2

을 찾을 수와 문제레일에서의 STI Inheiritance. 때문에 내 상속 구조 내 STI 테이블의 레코드 검색에 문제가 오전

class User < ActiveRecord::Base 

class LegacyUser < User 

class AuthUser < User 

class SuperUser < AuthUser 

class FieldUser < AuthUser 

class ClientAdmin < AuthUser 

문제는 찾으십시오 AuthUser 모델에서는 작동하지 않습니다. 쿼리에서 "AuthUser"유형을 찾고 있으며 다른 세 가지 가능성은 없습니다.

편집 :이 주위에 재생하는 동안이 기능이 구축되어야한다 보인다 있도록 만 ClientAdmin 및 FieldUser에 대한 작업을 시작했지만 지금은 방식 때문에 STI에 원래 문제

답변

3

방금이 동일한 문제가 발생하여 해결책 here을 발견했습니다.

간단히 말해, 중간 추상 클래스가 하위 클래스가로드되기 전에 무엇인지 알 수있는 방법이 없다는 것입니다. 이 문제를 해결하려면 해당 클래스 파일의 맨 아래에있는 모든 하위 클래스를 수동으로로드 할 수 있습니다.

는 auth_user.rb의 하단에 그래서 :

require_dependency 'super_user' 
require_dependency 'field_user' 
require_dependency 'client_user' 
0

에왔다. Rails에서 작동합니다 (모델 이름을 'type'이라는 데이터베이스 열에 저장함). 위에서 설명한 계층 구조를 지원하는 방법을 알지 못합니다 - 단일 레벨 계층 구조로 제한됩니다.

+0

내 DB에 유형 열을해야합니까. 처음에는 한 수준으로 만 제한적이라고 생각했지만 어느 시점에서는 AuthLogic 찾기가 4 가지 유형 모두를 찾고있었습니다. 이제 Base 만 보았습니다 – stellard

2

AuthUser 모델이 자체적으로 사용됩니까?

상속 된 클래스 간의 공유 메서드에 대한 클래스 인 경우 추상 클래스로 설정할 수 있습니다. 그렇게하면 ActiveRecord가 바로 통과 할 수 있습니다.

class AuthUser < User 
    self.abstract_class = true 
end 

이이 시나리오에서 작동하는지 모르겠어요,하지만 해볼만 한 가치는있을 수 : AUTHUSER의 선언에서

, 그냥이 같은 self.abstract_class = true를 추가합니다.

+0

AuthUser 클래스는 3 개의 하위 클래스의 공유 기능을 포함합니다. 이러한 추가 하위 클래스의 목적은 사용 권한 측면에서 다르게 대응하는 것입니다. – stellard

+0

좋습니다. 나는 항상 그런 식으로 사용한다. (그러나 STI의 중간은 아니다.) 보통의 경우, 그것을 추상적으로 설정하면 ActiveRecord가 해당 모델에 대한 테이블을 찾지 않도록 지시하므로 STI에서 (내 논리에 따라) 해당 유형을 찾지 않아야합니다. 즉, 해당 모델을 인스턴스화해야 할 경우 작동하지 않지만 하위 클래스 만 사용하면됩니다. –