Active Record: O Coração dos Modelos no Rails

O Active Record é uma das joias da coroa do framework Ruby on Rails, funcionando como a camada de mapeamento objeto-relacional (ORM) que conecta os objetos da sua aplicação com as tabelas do banco de dados. Neste post, vamos explorar como o Active Record simplifica o trabalho com dados e permite que você se concentre na lógica de negócio em vez de escrever SQL manualmente.

O que é o Active Record?

O Active Record implementa o padrão de mesmo nome criado por Martin Fowler, onde objetos incluem tanto os dados quanto o comportamento que atua sobre esses dados. No Rails, cada classe de modelo corresponde a uma tabela no banco de dados, e cada instância dessa classe representa uma linha específica na tabela.

Uma das belezas do Active Record é sua convenção sobre configuração. Ao seguir convenções de nomenclatura simples, ele consegue automaticamente inferir relações entre tabelas e mapear colunas para atributos de objetos sem necessidade de configuração adicional.

Definindo Seus Dados

No Active Record, você não precisa declarar explicitamente os atributos dos seus modelos. Ao invés disso, o Rails utiliza introspecção para determinar as colunas da tabela e criar getters e setters automaticamente. Por exemplo:

class Pedido < ApplicationRecord
end

Com apenas essa definição, você já tem acesso a todos os atributos da tabela pedidos. O Rails assume que classes no singular correspondem a tabelas no plural, e automaticamente mapeia Pedido para a tabela pedidos.

Relacionamentos entre Modelos

O Active Record suporta três tipos de relacionamentos:

  1. Um-para-um: Implementado com has_one e belongs_to
  2. Um-para-muitos: Implementado com has_many e belongs_to
  3. Muitos-para-muitos: Implementado com has_and_belongs_to_many ou através de um modelo de junção

Por exemplo, para definir que um pedido pode ter vários itens:

class Pedido < ApplicationRecord
  has_many :itens_pedido
end

class ItemPedido < ApplicationRecord
  belongs_to :pedido
end

Operações CRUD

O Active Record simplifica as operações de CRUD (Create, Read, Update, Delete):

Create (Criar)

pedido = Pedido.new(cliente: "João Silva", email: "joao@exemplo.com")
pedido.save
# ou
pedido = Pedido.create(cliente: "João Silva", email: "joao@exemplo.com")

Read (Ler)

pedido = Pedido.find(1)  # Encontra pelo ID
pedidos = Pedido.where(cliente: "João Silva")  # Encontra pela condição

Update (Atualizar)

pedido = Pedido.find(1)
pedido.cliente = "Maria Silva"
pedido.save
# ou
pedido.update(cliente: "Maria Silva")

Delete (Excluir)

pedido = Pedido.find(1)
pedido.destroy
# ou
Pedido.destroy(1)

Consultas Avançadas

O Active Record oferece uma API fluente para consultas que vai muito além do básico:

# Encontra pedidos recentes, ordenados por data
pedidos = Pedido.where("created_at > ?", 7.days.ago)
               .order(created_at: :desc)
               .limit(10)

Callbacks e Ciclo de Vida

Um dos recursos mais poderosos do Active Record são os callbacks, que permitem executar código em momentos específicos do ciclo de vida dos objetos:

class Pedido < ApplicationRecord
  before_save :normalizar_telefone
  after_create :enviar_email_confirmacao
  
  private
  
  def normalizar_telefone
    self.telefone = telefone.gsub(/\D/, '') if telefone.present?
  end
  
  def enviar_email_confirmacao
    PedidoMailer.confirmacao(self).deliver_later
  end
end

Transações

Para operações que precisam ser atômicas, o Active Record suporta transações:

Conta.transaction do
  conta1.depositar(100)
  conta2.sacar(100)
end

Se qualquer parte da transação falhar (por exemplo, se conta2 não tiver saldo suficiente), toda a operação será revertida, garantindo a consistência dos dados.

Conclusão

O Active Record é uma abstração poderosa que simplifica enormemente o trabalho com bancos de dados nas aplicações Rails. Ele elimina muito do código clichê normalmente associado ao acesso a dados e permite que você se concentre no que realmente importa: a lógica de negócio da sua aplicação.

À medida que você se torna mais familiar com o Active Record, descobrirá que pode expressar consultas complexas de maneira elegante e legível, sem sacrificar a eficiência. E quando precisar, sempre é possível recorrer ao SQL puro para casos específicos.

Comentários (0)

Nenhum comentário:

Postar um comentário