activerecord_symbolize a solução para o seus problemas
Posted on August 19, 2008, under Desenvolvimento, Ruby/Rails.
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
2 Replies to "activerecord_symbolize a solução para o seus problemas"
rafael on August 20, 2008
Parece bem interessante, além de ser portável. Vou dar uma olhada. Até mais!


Walter Cruz on August 20, 2008
Apenas uma nota: na versão 8.3 o PostgreSQL ganhou suporte a ENUMS, de uma forma muito interessante. Vale uma olhada em http://www.postgresql.org/docs/current/static/functions-enum.html !
Mas de fato pela compatibilidade com os bancos de dados, se afastar do enum é uma boa