假设我有模型User
。
我希望@user
为3种类型:admin
,regular
和pro
。
如果我创建了列type:String
,我当然可以在创建新的@user
,'admin'/'regular'/'pro'时传递字符串。
然后每次我使用@user
进行操作时都会检查
if @user.type == 'admin'
出于我的目的。
但我觉得这不是专业开发人员如何制作的。 (我在这儿吗?)
我希望User
模型的列只能包含3个特定值而不只是任何字符串。
答案 0 :(得分:2)
使用enum
列应该是整数,具有默认值(在以下示例中可能为0)。在您的模型中将其定义为:
enum type: { regular: 0, pro: 1, admin: 2 }
例如。
现在你自动拥有这些方法:
@user.regular?
@user.pro?
@user.admin?
此外,您可以调用@ user.type,您将获得一个很好的字符串表示形式:
> @user.type
=> "admin"
您还可以使用以下符号进行查询:
User.where(type: [:pro, :regular])
或
User.where.not(type: :admin)
等
这种方法也适用于CanCan gem。
答案 1 :(得分:1)
如果您想在应用中分配角色,只需使用Role-Based
特定宝石,例如Cancan
和Rollify
等。链接指向here。我将在下面解释为用户分配角色是多么容易,以及专业开发人员如何做到这一点。
在User
模型中,会有一个方法:
ROLES = %w[admin regular pro]
def role?(base_role)
ROLES.index(base_role.to_s) <= ROLES.index(role)
end
现在,您可以在UsersController
中查看是否:
if user.role? :admin
can :manage, Post
end
if user.role? :regular
can :manage, ForumThread
end
if user.role? :pro
can :manage, Forum
end
就这么简单...... !!! 我希望这有帮助.. !!! :)