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:
- Um-para-um: Implementado com
has_one
ebelongs_to
- Um-para-muitos: Implementado com
has_many
ebelongs_to
- 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.
Nenhum comentário:
Postar um comentário