1

레일과 사용자 역할에 대한 몇 가지 클래스 (AdminContributorMember 예) 상속 User 클래스를 형성 소자 분리 원칙에 따라, roles은과 같이 사용자 테이블에 jsonb로 저장됩니다사용자 클래스에서 상속 여러 역할 기반 클래스 I 클래스가 <code>User</code>라고 한 4

t.jsonb :roles, default: { 
    'admin':  false, 
    'contributor': false, 
    'member':  true 
    } 

적절한 서브 클래스 t를 설정하는 것이 가능 o 해당 역할에 대한 User의 인스턴스

u = User.create(...) 
u.class #<= returns 'User' 
u.grant_role(admin) 
u.class #<= should return 'Admin' 

내가 때마다 User 인스턴스가 인스턴스화되거나 업데이트되도록 before_save 콜백을 사용하여 생각하고, 적절한 클래스를 선택 : 즉, 같은 뭔가. 나는 올바른 길을 가고 있는가?

답변

1

즉석에서 인스턴스의 유형을 변경할 수 있다고 생각하지 않지만 여기서는 Ruby에 대해 이야기하는 것을 고려하여 100 % 확실하지 않습니다. :)

User 클래스를 변경하는 STI 대신 strategy pattern을 사용하는 것이 어떻습니까?

role 값에 따라 인스턴스화되는 RoleStrategy 클래스가 있어야합니다.

class User 
    # :foo and :bar are role dependent behaviors that you want to have. 
    delegate :foo, :bar, to: :role_strategy 

    private 

    def role_strategy 
    # Need to do some error handlings here, for example, if role is nil. 
    "#{role.classify}RoleStrategy".constantize.new(self) 
    end 
end 

class RoleStrategy 
    def initialize(user) 
    @user = user 
    end 

    def foo 
    do_it 
    end 

    def bar 
    do_something 
    end 
end 

class AdminRoleStrategy < RoleStrategy 
    def bar 
    do_something_else 
    end 
end 

동작은 자동으로 role의 가치가 무엇인지에 따라 달라질 것입니다 : 귀하의 경우를 들어

는,이 같은 수 있습니다.