Ruby Rails 从当前模型的枚举值获取下一个枚举

Ruby on Rails get next enum from current model's enum value

我在我的模型中使用这样定义的枚举:

enum role: [:member, :content_creator, :moderator, :admin]

我想要一种从用户当前角色获取下一个角色的简单方法,所以我想到了这个:

def self.next_role(user)
  begin
    User.roles.drop(User.roles[user.role] + 1).to_enum.next
  rescue StopIteration
    nil
  end
end

在视图中,我可能会添加以下方法链:[...].first.humanize.titleize.

我只是有点担心我的解决方案,但主要想知道是否有更好的(阅读:更多内置)方法来获得我想要的东西?我知道那里只有四个枚举,我承认我是从 if ... elsif ... etc. 开始实施的。换句话说,我发现自己在 Rails 方面比 Ruby 本身更精通。有人可以详细说明 "should" 是如何做到这一点的吗?

你觉得这个怎么样?好的,实际上并没有更多 "built in." 但我认为它与您的解决方案(在我看来是非常聪明的)完全不同,可以加入其中,至少可以提供一些不同的元素以供潜在地合并。

  def self.next_role(user)
    next_role = user.role.to_i + 1
    next_role == self.roles.length ? nil : self.roles.invert[next_role]
  end

User.roles 只是一个 ActiveSupport::HashWithIndifferentAccess,看起来像:

{ 'member' => 0,
  'content_creator' => 1,
  'moderator' => 2,
  'admin' => 3 }

使用它,此解决方案与您的解决方案非常接近,但没有异常处理。我也会将此作为 User 的实例方法,而不是 class 方法。

Returns 后续角色为字符串,如果当前角色为 :admin

则为 nil
def next_role
  User.roles.key(User.roles[role] + 1)
end

然后您可以调用(ruby 2.3 需要 &. 安全导航运算符)

user.next_role&.humanize