1

私はUserというクラスとUserクラスを形成継承するユーザの役割(例えばAdminContributorMember)のためのいくつかのクラスを持っている:複数の役割ベースのクラス - Railsの4

class Admin < User; end 

STIの原則に続き、rolesは、そのようなユーザーテーブルにjsonbとして格納されます。

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の値が何であるかに応じて変化するであろう。

関連する問題