【发布时间】:2010-11-26 05:21:36
【问题描述】:
如何在 Rails 3 迁移中描述枚举列?
【问题讨论】:
标签: ruby ruby-on-rails-3 enums migration
如何在 Rails 3 迁移中描述枚举列?
【问题讨论】:
标签: ruby ruby-on-rails-3 enums migration
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。
【讨论】:
simple_enum gem 的工作原理相同。查看更新的答案
在 Rails 3 迁移中,您可以执行以下操作:
class CreateFoo < ActiveRecord::Migration
def change
create_table :foo do |t|
t.column :foobar, "ENUM('foo', 'bar')"
end
end
end
这将创建具有单列“foobar”和值的表。
【讨论】:
您可以使用以下方式描述枚举列:
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 | |
【讨论】:
有点像
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
【讨论】:
我喜欢 enumerated_attribute 宝石:https://github.com/jeffp/enumerated_attribute
模型、对象和视图的简单枚举。
适用于 rails 3.1
【讨论】:
这也可以....
add_column :table_name, :column_name, "enum('abc','def','ghi')", :default => 'abc'
【讨论】:
我将使用 enum_fu gem:https://github.com/ikspres/enum_fu
【讨论】:
对我有用的是将它从符号映射到整数
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 以允许字符串访问
看看active_enum。
我认为它符合您的需求。
【讨论】:
使用 enum_column 为活动记录添加枚举支持
【讨论】:
t.enum :file_type ,:limit => [:jpg, :png, :gif] ,:default => :gif
【讨论】: