【问题标题】:Rails 4 enum - how to test equality?Rails 4 enum - 如何测试相等性?
【发布时间】:2026-02-21 10:40:01
【问题描述】:

我正在使用 Rails 4.1 和 Ruby 2.1.1

我的用户模型中有一行:

enum role: [:user, :admin, :team_admin, :domain_admin, :super_admin]

在我的控制器中,我只想在我的用户是 :domain_admin 并且我使用以下测试时才做某事:

if @user.role == :domain_admin

@user.role(在控制台中)返回:domain_admin 时,测试返回false。所以该值设置正确,但我一定是误解了测试它的相等性,或者枚举不像我以前想象的那样工作。我从阅读文档中假设它们是(小)整数上的薄层。

谁能告诉我如何测试:domain_admin 的相等性,以及如何测试>= :domain_admin

非常感谢。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 enums


    【解决方案1】:
    @user.domain_admin? # return true if :domain_admin
    

    改为:

    @user.role == :domain_admin
    

    使用:

    @user.role == "domain_admin"
    

    一些测试:

    => User.roles
    => {"user"=>0, "staff"=>1, "admin"=>2}
    => u = User.last
    => u.role
    => "user"
    => u.role == "user" # <-- this 
    => true
    => User.roles.each_pair { |x, _| puts u.role == x }
    => true
    => false
    => false
    

    【讨论】:

    • 请问有什么方法可以检查它是否位于这些枚举的范围内?我的意思是说,测试用户是 :domain_admin 还是更高级别的用户?
    • 谢谢 - 我现在明白了 :)
    • 为了后代,user.domain_admin?可以使用,我想你第一次说的 - 我已经切换到这种形式进行平等检查