2013-11-01 4 views
0

내 앱에는 types 명의 사용자 (운동 선수 & 사용자)가 있습니다. Athlete은 STI 설정을 사용하는 그대로 User 클래스를 상속합니다. 다른 유형의 사용자도 있지만 이러한 유형의 사용자는 역할에 따라 설정됩니다.레일 : 역할 기반 모듈 포함

예 :

코치 ->Regular User with the role of 'Coach'
학교 관리자 ->Regular User with the role of 'School Admin'
기여자 ->Regular User with the role of Contributor

사용자 유형으로 Coach을하는 데 사용 내 애플 리케이션에 남아있는

오래된 코드 (class Coach < User;),하지만 코치를 단일 사용자 유형으로 만들기 위해서는 앱에서 많은 의미를 갖지 않습니다. 나는 코치 모델의 메소드를 모듈로 가져와 모듈로 이동하려고하지만 사용자가 코치의 역할을 맡을 경우에만 모듈을 포함 할 수있는 방법이 있는지 궁금해합니다.

답변

0

예, 가능합니다. 그것이 될 것입니다 일을 한 가지 방법 :

class User < ActiveRecord::Base 
    ... 
    after_initialize :extend_with_role_module 

    private 

    def extend_with_role_module 
    case role 
    when 'coach' 
     self.extend CoachModule 
    when 'school_admin' 
     self.extend SchoolAdminModule 
    when 'contributor' 
     self.extend Contributor 
    end 
    end 
    ... 
end 

그러나이 after_initialize 블록이 메모리에로드되는 모든 User 인스턴스에 대해 호출됩니다로 끔찍한 디자인입니다. 이 코드는 아마도 리팩토링 때문일 것입니다.

출처 : Ruby 2.0.0 Docs - Object#extend