3

rails 不提供ENUM类型,但我确实需要一个只能接受五个值的数据成员。此外,我希望它与 Rails Forms Helper 自动集成:select_tag.
我的情况的正确解决方案是什么?

PS,如果存在内置且整洁的解决方案,我宁愿不使用外部插件。

4

4 回答 4

4

我将这样的功能尽可能靠近它的使用位置。

如果这些值被单个模型使用,只需将它们保留在模型中,例如,如果用户有某些可能的类型,并且只有那些类型,它可能看起来像:

class User < ActiveRecord::Base
  TYPES = %w{guest, paid, admin}

  # Plus validation on the `type` field.
  # Maybe plus a setter override that also validates.
end

当您需要在其他地方引用这些类型时,例如选择中的允许值:

User::TYPES

围绕此有许多有价值的调整,例如提供装饰器以使它们“人类可读”(大写、间隔等)或元编程方法以允许以下内容:

user.is_guest?   # Or...
user.make_guest! # Or...
user.guest!

我使用我自己的小 gem 来实现这个功能,因为通常情况下,一个成熟的关联太多了,没有提供任何价值。它允许以下内容:

class User < ActiveRecord::Base
  simple_enum :user_type, %w{guest, paid, admin}
end
于 2013-05-18T14:54:28.627 回答
3

使用此博客文章中的提示,它提供了一种非常简单的方法。你可以在你的模型上设置,然后在你的控制器或视图上使用它。在这种情况下,它将用整数映射状态。

STATUS = { pending: 0, active: 1, inactive: 2, deleted: 3 }

def status
  STATUS.key(read_attribute(:status))
end

def status=(s)
  write_attribute(:status, STATUS[s])
end
于 2013-05-18T15:15:41.423 回答
1

Rails 4.1 有枚举。我刚刚升级到测试版,它的工作就像一个魅力!

http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

我尝试了 active_enum gem,它很棒,但它与 rails 4 不兼容。 Paulo 的解决方案效果很好,如果需要,您可以将枚举提取到关注点中,但它对我来说开始变得太重了,所以我宁愿升级!

于 2014-01-18T17:42:30.940 回答
0

您可以轻松地将 Enum 定义为 ApplicationHelper 中的助手

class ApplicationHelper
  def select_range
    %w{"a", "b", "c", "d", "e"}
  end
end

然后在视图中您可以select_range自由调用。

于 2013-05-18T14:21:11.370 回答