rails 不提供ENUM
类型,但我确实需要一个只能接受五个值的数据成员。此外,我希望它与 Rails Forms Helper 自动集成:select_tag
.
我的情况的正确解决方案是什么?
PS,如果存在内置且整洁的解决方案,我宁愿不使用外部插件。
rails 不提供ENUM
类型,但我确实需要一个只能接受五个值的数据成员。此外,我希望它与 Rails Forms Helper 自动集成:select_tag
.
我的情况的正确解决方案是什么?
PS,如果存在内置且整洁的解决方案,我宁愿不使用外部插件。
我将这样的功能尽可能靠近它的使用位置。
如果这些值被单个模型使用,只需将它们保留在模型中,例如,如果用户有某些可能的类型,并且只有那些类型,它可能看起来像:
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
使用此博客文章中的提示,它提供了一种非常简单的方法。你可以在你的模型上设置,然后在你的控制器或视图上使用它。在这种情况下,它将用整数映射状态。
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
Rails 4.1 有枚举。我刚刚升级到测试版,它的工作就像一个魅力!
http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html
我尝试了 active_enum gem,它很棒,但它与 rails 4 不兼容。 Paulo 的解决方案效果很好,如果需要,您可以将枚举提取到关注点中,但它对我来说开始变得太重了,所以我宁愿升级!
您可以轻松地将 Enum 定义为 ApplicationHelper 中的助手
class ApplicationHelper
def select_range
%w{"a", "b", "c", "d", "e"}
end
end
然后在视图中您可以select_range
自由调用。