【问题标题】:how do you add constant value from a rails model如何从 Rails 模型中添加常量值
【发布时间】:2021-10-16 04:52:56
【问题描述】:

我有很多角色的用户,我想用数字或优先级数字标记这些角色。

例如:

管理员 - 4

客户 - 3

用户 - 2

客人 - 1

而不是在我的角色表中添加一个看起来像这样的新列

id name priority_num
1 Admin 4
2 Client 3
3 User 2
4 Guest 1

我想知道是否可以在我的角色模型类中执行此操作,这样我就不必创建到我的表的迁移并使其成为一个常量值。这甚至可能吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    应该很简单:

    class User
      def priority_num
        case name
        when 'Admin'
          4
        when 'Client'
          3
        when 'User'
          2
        when 'Guest'
          1
        else
          raise StandardError.new "#{name} does not have a priority_num configured"
        end
      end
    end
    

    但是,我可能会自己添加该列,以防它进一步扩展,并使其保持可查询性,而不必在外部报告工具中复制规则。

    【讨论】:

    • 我认为这将是可以接受的答案,因为我希望它返回一个整数。我认为这不会很快扩大,因为这是我们唯一接受的用户角色。可能会在 cmets 上添加错误。谢谢你。
    【解决方案2】:

    您可以使用枚举来更轻松地识别模型中的角色,而无需添加新的迁移。

    enum priority_num: {guest: 1, user: 2, client: 3, admin: 4}
    

    User.first.priority_num 将返回 "admin"

    您可以像这样比较以检查用户是否是管理员:

    user.priority_num == "admin"
    

    【讨论】:

    • 感谢您的回复先生。如果它只返回一个整数,那就太好了,因为我们必须检查当前用户的优先级数,如果它低于正在访问的配置文件,那么您可以查看它,如果它高于或等于则您无法访问它。
    【解决方案3】:

    @aRtoo

    enum priority_num: {guest: 1, user: 2, client: 3, admin: 4}
    
    user = User.first
    
    user.read_attribute_before_type_cast(:priority_num)
    

    给你一个整数的枚举状态

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2012-12-11
      • 2012-01-05
      • 2020-05-30
      相关资源
      最近更新 更多