【问题标题】:How to model system with different types of users?如何对不同类型用户的系统建模?
【发布时间】:2014-04-11 17:04:19
【问题描述】:

我正在开发一个餐厅特许经营应用程序。我只需要使用用户模型并拥有安全密码。

class User < ActiveRecord::Base
    has_secure_password

现在我将拥有具有不同访问权限和报告的不同类型的用户:

franchisor user (head office)
restaurant owner / franchisee
manager
waiter

推荐的设置模型/类的方法是什么? 我会为每个人创建一个模型并给每个人has_secure_password 还是将每个人都放入用户模型并为他们分配一个类型?还是做某种继承多态?

【问题讨论】:

    标签: ruby-on-rails ruby roles user-permissions


    【解决方案1】:

    我会在一个班级里做这件事,并为用户添加一个role 列,并为每个用户分配一个角色。

    # in user.rb
    class User < ActiveRecord::Base
      has_secure_password
    
      ROLES = %w[ franchisor restaurant_owner manager waiter ]
      validates :role, :inclusion => { :in => ROLES }
    
      ROLES.each do |role_name|        # generates for each ROLE a method like this:
        def #{role_name}?              #     def waiter?
          role == '#{role_name}'       #       role == 'waiter'
        end                            #     end
      end
    

    这使您可以在需要不同权限时询问user.franchisor? || user.manager? 之类的内容。

    这很简单,也是一个很好的起点。只要它不会变得更复杂,我会避免使用复杂的 gem。

    【讨论】:

    • 感谢您的帮助。你能解释一下 def #{role_name} 吗? role == '#{role_name}' 我以前没见过。
    • @spuggy 是元编程。该块遍历ROLES 数组中的所有role_names,并为每个role_name 创建一个方法,检查当前role 是否具有给定的role_name。当您在这里不使用元编程时,您需要自己实现所有这些方法。并且在更改Roles 数组时需要添加或删除方法。查看更新的答案,我添加了一个生成的示例。
    【解决方案2】:

    我强烈建议使用Devise 进行身份验证,使用CanCan 来管理您的权限,并使用RolifyRole Model 之类的东西来为不同类型的用户定义不同的角色。

    我已经写了一个教程来开始使用这些:http://www.phase2technology.com/blog/authentication-permissions-and-roles-in-rails-with-devise-cancan-and-role-model/

    【讨论】:

      猜你喜欢
      • 2016-04-16
      • 1970-01-01
      • 2016-06-10
      • 2014-10-20
      • 2010-11-21
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多