1

我有一類稱爲User和幾類用戶的角色(如AdminContributorMember)繼承形成User類:多個基於角色的類 - 軌道4

class Admin < User; end 

繼STI原則,roles存儲爲jsonb users表中,像這樣:

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

是否可以設置相應的子類ŧ o相應角色User的實例。換句話說,這樣做:

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

我想用before_save回調,這樣每次User實例的實例或更新的,適當的類被選中。我在正確的軌道上嗎?

回答

1

我不認爲有可能在實時更改實例的類型,但我不能100%確定這一點,因爲我們在此討論Ruby。 :)

而不是STI,它正在改變User的類,那麼使用strategy pattern怎麼樣?

有一組RoleStrategy類實例化取決於role的值。

對於你的情況,也可能是這樣的:

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值發生變化。