Se você já usa enum
nos seus modelos Rails, prepare-se: o Rails 8 trouxe mudanças importantes que impactam diretamente a forma como escrevemos e usamos enums no dia a dia. Neste artigo, vou te mostrar o que mudou, por que mudou e como aproveitar ao máximo essas melhorias — sem quebrar seu projeto no meio do caminho.
O que é enum mesmo?
Antes de mergulhar nas mudanças, uma rápida lembrança:
enum :status, [:draft, :published, :archived]
Com essa linha, o Rails cria automaticamente métodos como .draft!
, .published?
, escopos, validações, e mapeia os valores de forma clara e prática. Isso ajuda a manter seu código limpo, expressivo e fácil de manter.
Mas o que mudou no Rails 8?
1. Nova Sintaxe (e a antiga foi embora)
No Rails 7, muita gente escrevia enums assim:
# ❌ Isso quebrou no Rails 8
enum status: [:draft, :published]
No Rails 8, essa forma com keyword argument não é mais aceita. Agora é obrigatório usar argumentos posicionais:
# ✅ Forma correta no Rails 8
enum :status, [:draft, :published]
Essa nova forma é mais clara, consistente com outras APIs do Rails (attribute
, validates
, etc.) e evita ambiguidades.
2. Menos repetição: o Rails agora entende o tipo da coluna
Uma das melhorias mais úteis do Rails 8 é que agora ele infere automaticamente o tipo de dado do enum com base na coluna do banco de dados.
Exemplo 1: coluna integer
# status é uma coluna integer
enum :status, [:draft, :published]
# Rails mapeia: { draft: 0, published: 1 }
Exemplo 2: coluna string
# status é uma coluna string
enum :status, [:draft, :published]
# Rails mapeia: { draft: "draft", published: "published" }
Antes, se a coluna fosse string
, você era obrigado a fazer:
enum :status, { draft: "draft", published: "published" }
Agora isso é totalmente opcional. O Rails detecta e faz esse mapeamento sozinho. Mais legível, menos boilerplate.
3. Validação mais segura com strict: true
(opcional)
Se você quiser que apenas os valores definidos no enum sejam aceitos, use:
enum :status, [:draft, :published], strict: true
Com isso, qualquer tentativa de atribuir um valor inválido — como post.status = :cancelled
— vai gerar um ArgumentError
.
Isso evita erros silenciosos e torna seu código mais confiável, especialmente em APIs ou sistemas críticos.
Extra: Usando enum com tipos nativos do PostgreSQL
Se você usa PostgreSQL, pode aproveitar o tipo enum
do próprio banco para garantir ainda mais integridade.
Migration:
class AddStatusEnum < ActiveRecord::Migration[8.0]
def up
execute <<-SQL
CREATE TYPE status AS ENUM ('draft', 'published', 'archived');
SQL
add_column :posts, :status, :status, default: 'draft'
end
def down
remove_column :posts, :status
execute "DROP TYPE status;"
end
end
Mesmo com o tipo definido no banco, você ainda pode usar o helper do Rails:
enum :status, [:draft, :published, :archived]
O melhor dos dois mundos: validação no banco + funcionalidades do Rails.
O enum
no Rails 8 ficou mais inteligente, limpo e seguro. Com a nova sintaxe, você escreve menos e seu código continua expressivo. A inferência automática de tipo baseada na coluna reduz erros e elimina a redundância.
Se você ainda está no Rails 7, essa é uma daquelas melhorias que vale a pena considerar como argumento pra migrar. E se já está no 8, aproveita pra revisar como seus enums estão definidos e ver se dá pra simplificar.
E aí, tem alguma dica extra sobre o uso de enums?
Até a próxima!