2

AB의 두 가지 유형의 사용자가 있다고 가정 해 보겠습니다. B 유형의 사용자는 필드에 대한 권한이 적고 유효성이 덜 엄격합니다 (공란이 될 수 있음). 그렇지 않으면 기본적으로 유형이 A입니다. 이 사실로 인해 단일 테이블 상속을 사용하게되었습니다.모델을 레일로 변환 (단일 테이블 상속)

내 관심사 - B 사용자는 A 유형으로 업그레이드 할 수 있습니다. 업그레이드 할 때 관련 레코드를 모두 보관해야합니다. STI를 사용하여 한 모델 유형에서 다른 모델 유형으로 쉽게 변환 할 수있어 모든 연결이 보존됩니다. 간단한 예제를 줄 수 있습니까?

답변

2

당신이 type 열에서 올바른 값을 제공했는지 확인하기 만하면됩니다.

사용자 A에 대한 사용자 B를 업그레이드하는 동안, 그냥 사용자 A의

클래스 이름 type 속성에 저장된 값을 변경합니다.

예는 :

class Staff < ActiveRecord::Base; end 
class PartTimeStaff < Staff; end 

part_time_staff = PartTimeStaff.first 
part_time_staff.type = "Staff" 
part_time_staff.save 

는 직원 클래스에 파트 타임 직원을 업그레이드합니다.

모든 연결은 변경되지 않아야합니다. 당신은 오직 하나의 실제 SQL 테이블을 가지고 있기 때문에.

PartTimeStaff 및 Staff 클래스의 모든 속성은 동일한 테이블에 보관됩니다.

Rails APISingle Table Inheritance

감사

+0

PS에서 자세한 내용을 참조하십시오. 'type' 컬럼보다는 Single Table Inheritance에 대해 다른 컬럼 이름을 사용하려면 모델에서 ** set_inheritance_column ** 메소드를 사용하십시오. – peterpengnz

+0

감사합니다. 정확히 내가 찾고/바라는 것. – Raphael

-1

유형 필드가있는 사용자 모델을 하나만 가질 수 있으며 유형에 따라 유효성 검사가 달라질 수 있습니다.

class User 
    validates :name, presence: true, if: :advanced_user? 

    protected 

    def advanced_user? 
    self.type == 2 
    end 
end 
관련 문제