【问题标题】:Rails enum mapping to displayable textRails 枚举映射到可显示的文本
【发布时间】:2015-07-20 04:14:33
【问题描述】:

Rails 4 的枚举实现非常适合制作状态字段,例如

class User < ActiveRecord::Base
  enum status: [:goodstanding, :outstanding]

但是如果我想根据状态显示文本,这个文本映射应该在一个地方,并且枚举不提供映射到文本的解决方案。

这是我以前的东西

class User < ActiveRecord::Base
  STATUS = {
    :outstanding => "Outstanding balance",
    :goodstanding => "In good standing"
  }

这让我可以这样做

User::STATUS[user.status] # "In good standing"

显示我的文字。有关如何使用较新的枚举类型执行此操作的任何建议?

【问题讨论】:

    标签: ruby-on-rails enums


    【解决方案1】:

    是的,这可以在 rails 4.1+ 中完成,但它的行为出乎意料,并且已在 rails 5 分支中修复。

    来源:https://github.com/rails/rails/issues/16459

    例如:

    class User
      enum name: {
        foo: 'myfoo',
        bar: 'mybar'
      }
    end
    

    现在当你这样做时:

    u = User.new(name: 'foo')
    u.save
    

    然后就会执行:

    INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('myfoo', '2015-07-20 04:53:16', '2015-07-20 04:53:16')
    

    对于foo,它插入了myfoo。现在当你这样做时:

    u = User.last
    
    u.name
     => "foo"
    
    u[:name]
     => "myfoo"
    

    我已经尝试了上述方法。虽然也有各种可用的宝石,但我从未使用过它们,但它们可能对您有所帮助:

    1. enumerize
    2. simple_enum
    3. classy_enum

    来源:Possibility of mapping enum values to string type instead of integer

    希望这会有所帮助。

    【讨论】:

    • +1 用于在 Rails 5 中修复。我在其他地方看到了这个答案,并且看到了其中的一些宝石(未枚举)。我只是不想为此使用宝石。期待在 Rails 5 中使用它,谢谢。
    • 有人可以用一个更好的例子来更新这个问题吗?作为一个新手,这个例子很混乱。
    猜你喜欢
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多