如何为数据库值定义特定选项

时间:2015-11-17 10:46:31

标签: ruby-on-rails

假设我有模型User

我希望@user为3种类型:adminregularpro

如果我创建了列type:String,我当然可以在创建新的@user,'admin'/'regular'/'pro'时传递字符串。

然后每次我使用@user进行操作时都会检查

if @user.type == 'admin' 

出于我的目的。

但我觉得这不是专业开发人员如何制作的。 (我在这儿吗?)

我希望User模型的列只能包含3个特定值而不只是任何字符串。

2 个答案:

答案 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特定宝石,例如CancanRollify等。链接指向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

就这么简单...... !!! 我希望这有帮助.. !!! :)