Atualize Seu Projeto: A Nova Forma de Usar Enum no Rails

Ruby on Rails
23 de abril de 2025

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!

2 min. de leitura
Top