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
我在我的模型中使用这样定义的枚举:
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
则为 nildef next_role
User.roles.key(User.roles[role] + 1)
end
然后您可以调用(ruby 2.3 需要 &.
安全导航运算符)
user.next_role&.humanize