Tipo Postgres Enum no Rails 4

Rails ainda não tem suporte para os tipos Enum do Postgres , mas se você precisa deles hoje , aqui está uma maneira rápida de fazê-lo.

Então você criou o tipo enum no banco de dados:

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');

Devemos informar o ActiveRecord. Primeiro alias do tipo para texto (faça isso para evitar avisos de tipo “OID inválido”, na verdade, este será um tipo personalizado, uma vez que o Rails os suporta fora da caixa):

ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID.alias_type 'my_enum_type', 'text'

Você também deseja corrigir o analisador de coluna para retornar o tipo de coluna correto:

class ActiveRecord::ConnectionAdapters::Column
private
def simplified_type_with_my_enum_type(field_type)
if field_type == 'my_enum_type'
field_type
.to_sym
else
simplified_type_without_my_enum_type
(field_type)
end
end
alias_method_chain
:simplified_type, :my_enum_type
end

Ao consultar, você também desejará converter a string para o seu tipo, por exemplo (se desejar, existe uma maneira de fazer os rails convertê-la automaticamente, consulte OID :: Point neste pedido de pull ):

scope :my_enum_value_is, ->(value){ 
where('my_enum_value = ?::my_enum_type', value)
}

Esta é uma versão estendida de uma resposta a esta pergunta StackOverflow e inclui informações dos comentários