Criando Colunas Virtuais no Rails 7: Um Guia Passo a Passo

Criando Colunas Virtuais no Rails 7: Um Guia Passo a Passo
Photo by Jan Antonin Kolar / Unsplash


O Rails 7 traz uma série de novos recursos e melhorias, tornando ainda mais fácil construir aplicações web robustas e de fácil manutenção. Um dos recursos poderosos disponíveis no Rails é a capacidade de criar colunas virtuais (ou computadas/geradas) nas tabelas do banco de dados. Neste post, exploraremos como criar uma coluna virtual no Rails 7, com explicações detalhadas e exemplos.

O que são Colunas Virtuais?

Colunas virtuais são colunas do banco de dados que não são diretamente armazenadas, mas sim calculadas com base em expressões que envolvem outras colunas. Elas podem ser particularmente úteis para dados derivados, como concatenações, cálculos ou transformações que precisam estar sempre consistentes com os dados de origem.

Exemplo de Cenário

Suponha que temos uma tabela PersonalDocuments e queremos adicionar uma coluna full_name que armazena o nome completo de uma pessoa, além de uma coluna virtual full_name_length que calcula o comprimento do nome completo.

Criando a Migration

Para criar a tabela PersonalDocuments com as colunas necessárias, usaremos o método de migration create_table. Veja como fazer isso:

Migration

class CreatePersonalDocuments < ActiveRecord::Migration[7.0]
  def change
    create_table :personal_documents do |t|
      t.string :full_name
      t.virtual :full_name_length, type: :integer, as: "length(full_name)", stored: true

      t.timestamps
    end
  end
end

Explicando o código:

  • create_table :personal_documents: Cria uma nova tabela chamada personal_documents.
  • t.string :full_name: Adiciona uma coluna full_name à tabela.
  • t.virtual :full_name_length, type: :integer, as: "length(full_name)", stored: true: Adiciona uma coluna virtual full_name_length que calcula o comprimento da coluna full_name.
  • A opção stored: true garante que o valor de full_name_length seja calculado quando a linha for inserida ou atualizada, sendo armazenado no banco de dados. Isso torna as consultas mais eficientes, pois o valor não precisa ser recalculado toda vez que for acessado.

Atualizando o Modelo

No seu modelo PersonalDocument, não é necessária nenhuma configuração especial para a coluna virtual. Ela estará disponível como um atributo de leitura.

Modelo

class PersonalDocument < ApplicationRecord
  # Qualquer outra lógica do modelo
end

Usando a Coluna Virtual

Agora você pode usar a coluna virtual full_name_length como qualquer outro atributo. Aqui está um exemplo de como criar um registro e acessar a coluna virtual:

Exemplo de Uso

personal_document = PersonalDocument.create(full_name: "John Doe")
puts personal_document.full_name_length  # Saída: 8

Considerações Importantes

  • Armazenado vs. Virtual: A opção stored: true faz com que a coluna seja uma "coluna gerada armazenada", o que significa que seu valor é calculado quando a linha é inserida ou atualizada, e armazenado no banco de dados. Se você quiser que o valor seja recalculado sempre que for acessado, pode usar stored: false (embora o suporte para isso varie entre os bancos de dados).

Verificando a Configuração

Após rodar a migration, você pode verificar as colunas com os seguintes comandos no console do Rails:

rails db:migrate
rails console
personal_document = PersonalDocument.create(full_name: "Jane Doe")
puts personal_document.full_name_length  # Deve exibir: 8

Essa configuração garante que, sempre que o full_name for atualizado, a coluna virtual full_name_length seja recalculada automaticamente e armazenada.

Conclusão

As colunas virtuais no Rails 7 oferecem uma maneira eficiente de manter dados derivados consistentes, eliminando a necessidade de cálculos redundantes e melhorando o desempenho em consultas. Utilizar colunas virtuais com a opção stored: true pode otimizar a sua aplicação, especialmente em cenários onde os dados derivados são frequentemente acessados e precisam ser mantidos em sincronia com outras colunas.