如何在Rails 3中的Postgres数据库中使用枚举?

B S*_*ven 21 postgresql enums ruby-on-rails database-migration ruby-on-rails-3

PostgreSQL具有内置于数据库中的枚举类型的概念.

如何实现一个包含在Rails 3中使用枚举类型的列的表?你需要以某种方式在PostgreSQL中定义枚举吗?你怎么能创建一个这样做的数据库迁移?

使用Rails 3.07,Ruby 1.92p180,PostgreSQL 8.3.

rdv*_*ijk 13

Rails不支持ENUM开箱即用的数据类型.这是因为并非所有数据库都支持该数据类型.我发现处理ENUM值的常用方法是在数据库中手动创建枚举列(在您的情况下为PostgreSQL),并将其作为stringRails应用程序中的列处理.然后,使用validates_inclusion_of验证程序强制使用允许的值.

validates_inclusion_of :gender, :in => [ "male", "female" ]
Run Code Online (Sandbox Code Playgroud)

并在迁移中使用本机SQL来添加枚举字段:

class AddEnumType < ActiveRecord::Migration
  def up
    execute ".." # your native PostgreSQL queries to add the ENUM field
  end
end
Run Code Online (Sandbox Code Playgroud)

编辑(2014年6月)

Rails 4.1现在支持枚举.在validates_inclusion_of现在可以改为:

enum gender: [ :male, :female ]
Run Code Online (Sandbox Code Playgroud)

(但是,底层数据库仍然不支持此功能,因此仍需要本机SQL迁移.)

  • 假.db:test:准备对挂起的迁移进行检查,并从db/schema.rb加载模式 (5认同)
  • 这意味着你不能做一个架构:加载,因为它打破了shema.rb.对于mysql,有rubygem-enum_column3 gem.Dunno修改那个为postgres工作也有多难 (3认同)

bri*_*all 9

您还可以将架构设置为使用原始SQL而不是.rb文件.如果您正在利用数据库的更高级功能(枚举,全文搜索,触发器,函数等),而不是简单地将其用作通用数据存储,这将使您的生活更轻松.

只需在config/application.rb中设置此行即可

# Use SQL for the schema due to many database specific settings
config.active_record.schema_format = :sql
Run Code Online (Sandbox Code Playgroud)

它将输出一个structure.sql文件,它将为您解决该问题.