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

时间:2010-11-26 05:21:37

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

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

11 个答案:

答案 0 :(得分:66)

Rails 4.1 contains enum目前!

你可以写

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

对于迁移写入

t.integer :status

Rails 3&amp; 4.0

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

答案 1 :(得分:8)

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

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

这将创建具有单列&#34; foobar&#34;的表格。和价值观。

答案 2 :(得分:4)

您可以使用以下内容描述枚举列:

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    |              |

答案 3 :(得分:3)

这样的东西
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

答案 4 :(得分:3)

我喜欢 enumerated_attribute gem:https://github.com/jeffp/enumerated_attribute

轻松枚举模型,对象和视图。

使用rails 3.1正常工作

答案 5 :(得分:2)

这也有效....

add_column :table_name, :column_name, "enum('abc','def','ghi')", :default => 'abc'

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

看看active_enum

我认为它符合您的需求。

答案 9 :(得分:0)

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

https://github.com/mdsol/enum_column

答案 10 :(得分:-3)

t.enum :file_type ,:limit => [:jpg, :png, :gif] ,:default => :gif