Ruby 布尔值vs.枚举vs.标志

Ruby 布尔值vs.枚举vs.标志,ruby,sinatra,datamapper,ruby-datamapper,Ruby,Sinatra,Datamapper,Ruby Datamapper,我正在开发一个允许用户登录的网站。所有用户都有一个帐户,一个帐户可以有多个订单。用户可以是客户、工人或经理。客户既不是工人也不是经理。经理也是工人。我想根据登录用户的类型介绍页面/导航选项的其他部分 目前,我正在使用一组布尔值将用户标记为特定类型,测试该值,并运行一些if/elsif块以生成用户看到的页面 class User include DataMapper::Resource # ... # various properties # ... property :cli

我正在开发一个允许用户登录的网站。所有用户都有一个帐户,一个帐户可以有多个订单。用户可以是客户、工人或经理。客户既不是工人也不是经理。经理也是工人。我想根据登录用户的类型介绍页面/导航选项的其他部分

目前,我正在使用一组布尔值将用户标记为特定类型,测试该值,并运行一些if/elsif块以生成用户看到的页面

class User
  include DataMapper::Resource
  # ...
  # various properties
  # ...
  property :client, Boolean
  property :worker, Boolean
  property :manager, Boolean
end
然后我使用before过滤器测试用户类型,并将结果设置为变量

before do
  @user = session[:user]
  if @user.client?
    @ura = 'client'
  elsif @user.worker?
    @ura = 'worker'
  elseif @user.manager?
    @ura = 'manager'
  end
end
那么在我看来,我有@ura可玩。在我看来,这已经给我的经理们带来了麻烦,因为@ura必须既是工人又是经理。我可以在视图中使用一些or,但我认为更好的解决方案是将用户类型设置为枚举或标志。但我真的不明白如何在我的过程中使用它


我想知道每种方法的优点/缺点是什么&这是一个基本的例子,说明我如何在@ura中得到一个合适的值。

我不确定,但数组可能是更好的解决方案:

class User ....
   def getRoles
      roles = Array.new
      roles << "client" if self.client? 
      roles << "manager" if self.manager? 
      roles << "worker" if self.worker? 
      roles
   end
end

before do
  @user = session[:user]
  if(@user.getRoles.index("manager") != nil)
    ...
类用户。。。。
def getRoles
roles=Array.new

角色我不记得我是如何解决这个问题的(我想这是一个自行车递送应用程序),但今天我注意到这个问题仍然没有答案

所以,十年后,即使我不再经常使用DataMapper,他也是我现在解决这个问题的方法

当时,我没有完全理解系统中用户的
角色的身份验证和授权之间的区别

class User
  include DataMapper::Resource
  ...
  properties
  ...
  property :role, Enum[ :client, :worker, :manager ]
end

class Employee < User
  include DataMapper::Resource
  ...
   more properties
end
类用户
包含数据映射器::资源
...
性质
...
属性:角色,枚举[:客户端,:工作者,:经理]
结束
类Employee
通过这种方式,所有用户都可以得到他们需要的东西,员工可以进一步分为
工人
经理
。然后可以对相应的模型进行适当的验证。更多的前期代码,但更易于维护和扩展,只需向
User
Enum&相应的类添加一个新角色即可


如果类除了名称空间/逻辑分离之外没有做任何事情,那么您甚至可以通过一些元编程/反射从枚举中推断类,并在初始化时包含适当的模块。

这与我的想法类似。似乎使用类似于
property:role,Enum[:client,:worker,:manager]
的东西基本上可以给出您在一行中描述的内容。我的理解是,一次只能有一个枚举。(即,
user.role=:worker
将覆盖:role的任何当前值),而
标志可以将任何定义的值作为属性保存。我得到了
Enum
,但我不理解
标志的关系(即,如何设置和取消设置
标志的特定值?*(一旦设置它们就可以取消设置吗?*)理想情况下,我希望能够拥有类似
.client?
的东西,并返回
true
false
。这样我就可以做类似于
如果@ura.client?
的事情了。(我可以自己找出代码,我只是想找到最好的方式来表示这些信息。)