Um dos erros que cometi quando comecei a desenvolvimento da loja foi usar o tipo enum do banco de dados mysql em algumas tabelas. O erro foi agravado pelo uso do plugin enum-column que adicionar suporte a esse tipo de coluna no ActiveRecord.

O problema se concentra no fato de que o tipo enum não é suportado por todos os bancos de dados, o que impede a migração da aplicação para outro tipos de banco que não sejam mysql. O plugin agrava o problema, não por si só, mas pela falta de atualização.

A partir do Rails 2.0 temos as sexy migration, por isso na criação de uma tabela usamos:

Isso adiciona um coluna do tipo enum no banco de dados, mas atualiza o arquivo schema.rb de forma errada, observe o código abaixo do arquivo schema.rb:

Não existe o método enum para class ActiveRecord::ConnectionAdapters::TableDefinition, o que gera erros quando usamos o schema.rb para criar o banco de dados, o que acontece sempre que rodamos testes por exemplo. A solução para este ultimo problema seria atualizar o plugin, mas ainda sim teríamos o outro problema.

Pensando nisso fui no github atrás de um plugin alternativo, acabei por encontrar o activerecord_symbolize, um plugin que na sua versão básica adiciona o suporte a atribuição de tipos simbólicos as propriedades de um modulo.

Mas lendo a documentação e testando o plugin acabei descobrindo que ele seria pouco para o que queria, por isso fiz um fork do projeto e adicionei algumas características ao plugin. Já fiz um pedido de pull para o projeto original e estou aguardando para ver se minhas modificações são aceitas. Enquanto isso vamos a forma de utiliza-lo.

Para instalar o plugin pode ser fazer o básico:

script/plugin install git://github.com/nuxlli/activerecord_symbolize.git

Na sua tabela usasse tipo string mesmo:

No seu model adicione:

Feito isso, User passa aceitar apenas os valores :female e :male para o atributo gender, gerando um erro de validação caso algum outro valor seja passado, o mesmo acontece com so. Se o symbolize fosse chamado sem a definição de in ele passaria a aceitar qualquer simbolo sem erro de validação.

Um outro recurso que adicionei foi dois helpers para facilitar na hora de criar formulários, ficando assim:

Com isso já se obtém dois campos radios para escolha do gênero e um select para escolha do SO, sendo que suas opções são puxadas diretamente da definição do symbolize.

Para mais informações: activerecord_symbolize