【问题标题】:How do I describe an enumeration column in a Rails 3 migration?如何描述 Rails 3 迁移中的枚举列?
【发布时间】:2010-11-26 05:21:36
【问题描述】:

如何在 Rails 3 迁移中描述枚举列?

【问题讨论】:

    标签: ruby ruby-on-rails-3 enums migration


    【解决方案1】:

    Rails 4.1 contains enum 现在!

    你可以只写

    class User < ActiveRecord::Base
      enum status: [ :admin, :user, :banned ]
    end
    

    用于迁移写入

    t.integer :status
    

    Rails 3 和 4.0

    我认为最好的解决方案是simple_enum gem。

    【讨论】:

    • 不幸的是,这些值存储为整数而不是 ENUM,有几个缺点:hn.meteor.com/posts/6925010-32d11
    • @migu 这是 rails 枚举的事实标准。 simple_enum gem 的工作原理相同。查看更新的答案
    • @migu 你能仔细检查那个链接吗?我对它非常感兴趣,但它对我没有用。 :) 谢谢。
    • 他们询问的是 rails 3,而不是 4
    【解决方案2】:

    在 Rails 3 迁移中,您可以执行以下操作:

    class CreateFoo < ActiveRecord::Migration
      def change
        create_table :foo do |t|
          t.column :foobar, "ENUM('foo', 'bar')"
        end
      end
    end
    

    这将创建具有单列“foobar”和值的表。

    【讨论】:

      【解决方案3】:

      您可以使用以下方式描述枚举列:

      t.column 'role', 'user_role'
      

      我创建了枚举类型:

      execute "CREATE TYPE user_role AS ENUM ('consultant', 'admin');"
      

      检查数据库:

          Column     |          Type          | Modifiers | Storage  | Stats target | Description
      ---------------+------------------------+-----------+----------+--------------+-------------
       role          | user_role              |           | plain    |              |
      

      【讨论】:

        【解决方案4】:

        有点像

        class User < ActiveRecord::Base
           validates_inclusion_of :status, :in => [:active, :inactive]
        
           def status
             read_attribute(:status).to_sym
           end
        
           def status= (value)
             write_attribute(:status, value.to_s)
           end
         end
        

        【讨论】:

        【解决方案5】:

        我喜欢 enumerated_attribute 宝石:https://github.com/jeffp/enumerated_attribute

        模型、对象和视图的简单枚举。

        适用于 rails 3.1

        【讨论】:

          【解决方案6】:

          这也可以....

          add_column :table_name, :column_name, "enum('abc','def','ghi')", :default =&gt; 'abc'

          【讨论】:

            【解决方案7】:

            我将使用 enum_fu gem:https://github.com/ikspres/enum_fu

            【讨论】:

            • 自 2009 年以来没有更新。似乎没有积极维护。
            【解决方案8】:

            对我有用的是将它从符号映射到整数

            TYPE_MAP = { type_one: 1, type_two:2, another_type:3 }
            
            def type
                TYPE_MAP.key(read_attribute(:type))
            end
            
            def type=(s)
                write_attribute(:type, TYPE_MAP[s])
            end
            

            但是对于控制器,您必须像这样再次映射它:

             def create
              @cupon_type = CuponType.new(params[:cupon_type])
              @cupon_type.type = params[:cupon_type][:type].to_sym
            

            注意 .to_sym 覆盖对象上的第一次创建(在我的例子中是优惠券)。

            现在你可以像这样使用它了:

            c.type == :type_one
            c.type = :type_two
            

            【讨论】:

            • 您可以将.with_indifferent_access 添加到TYPE_MAP 以允许字符串访问
            【解决方案9】:

            看看active_enum

            我认为它符合您的需求。

            【讨论】:

              【解决方案10】:

              使用 enum_column 为活动记录添加枚举支持

              https://github.com/mdsol/enum_column

              【讨论】:

                【解决方案11】:
                t.enum :file_type ,:limit => [:jpg, :png, :gif] ,:default => :gif
                

                【讨论】:

                • 你用的是什么插件?默认不支持枚举
                • 脚本/插件安装 svn://rubyforge.org/var/svn/enum-column/plugins/enum-column
                猜你喜欢
                • 1970-01-01
                • 2015-12-30
                • 1970-01-01
                • 2012-05-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-03-12
                • 2010-10-16
                相关资源
                最近更新 更多