Entendendo Active Record, a Gem do Rails e o Design Pattern
Luiz Fernando Puri
Posted on October 23, 2024
Rails é um dos frameworks mais populares em aplicações web, não apenas pela sua capacidade de acelerar o desenvolvimento, mas também por seus componentes robustos, como o Active Record, que transforma a maneira como interagimos com bancos de dados. Um dos motivos de sua popularização foi a produtividade que o Rails trouxe, permitindo o desenvolvimento mais rápido de aplicações utilizando menos código.
A Gem Active Record
O Rails nos fornece uma classe base, ActiveRecord::Base
, que nos permite associar classes (models) às tabelas do banco de dados. É através dessa associação e atuação da gem que conseguimos manipular os dados a partir do objeto. Isso torna possível o uso que estamos acostumados, de atualizar informações no banco de dados através dos objetos, em vez de escrever queries SQL.
Por exemplo, usamos:
User.where(age: 26, favorite_color: 'blue', country_id: 55)
Em vez de:
SELECT * FROM users WHERE age = 26 AND favorite_color = ‘blue’ AND country_id = 55;
Porém o Active Record não é apenas uma gem do Rails. Active Record é um Design Pattern. Um padrão que lida com a camada de persistência dos dados.
O Active Record Pattern
Esse padrão foi proposto por Martin Fowler no livro "Patterns of Enterprise Application". Em seu site podemos encontrar essa explicação sobre o padrão:
“Um objeto que encapsula uma linha em uma tabela ou exibição de banco de dados, encapsula o acesso ao banco de dados e adiciona lógica de domínio a esses dados.”
Active Record é um padrão de Mapeamento Objeto-Relacional (ORM). Com a popularização das linguagens do paradigma Orientado a Objetos percebeu-se que era gasto muito tempo desenvolvendo queries SQL. A partir disso, nos anos 90 surge o conceito de ORM, essa técnica/abordagem para resolver esse problema.
No padrão Active Record cada model é associado a uma tabela e cada instância (objeto) dessa classe é equivalente a uma linha dessa tabela. Esse objeto é responsável por suas próprias operações de persistência, além de manipular seus próprios dados (diferente do padrão Data Mapper, onde a lógica de persistência é feita por outro objeto próprio pra isso)
Principais atuações da Gem Active Record no Rails
Convenção sobre configuração: Por convenção, o models herdam de ApplicationRecord que herda da classe ActiveRecord::Base
. Dessa forma o mapeamento é automatizado entre classes e tabelas, atributos e colunas. Caso tenhamos um model chamado ‘BookClub’ o ActiveRecord irá associar esse modelo à uma tabela com o nome ‘book_clubs’. Enquanto o model segue o padrão de nomenclatura CapitalCase, a tabela segue o padrão snake_case no plural.
Associações entre objetos: Podemos definir associações entres os objetos de forma simples através de métodos de classe como:
has_many, has_one, belongs_to, has_and_belongs_to_many
Regras de validação: Disponibiliza métodos que nos permite adicionar validações de forma simples:
acceptance, confirmation, comparison, format, inclusion, numericality, presence, uniqueness # E outros
E também definir condições para essas validações ou adicionar validações customizadas através dos métodos:
if, unless e validate
Callbacks: Disponibiliza métodos de retorno de chamada para todo o ciclo de vida (instanciação, salvamento, destruição, validação, etc.):
before_validation, before_save, before_create, after_create, after_save, before_update, after_update, before_destroy etc
Isso nos permite adicionar código para um comportamento desejado, em um momento específico do ciclo de vida do objeto (Porém use com moderação, usar callbacks em excesso pode te trazer dor de cabeça depois)
Transactions:
Que são blocos de proteção, onde as instruções SQL só são aplicadas se todas elas puderem ser concluídas com sucesso. O exemplo mais conhecido talvez seja o de uma transação financeira
Account.transaction do
david.withdrawal(100)
mary.deposit(100)
end
Abstração de banco de dados por meio de adaptadores simples:
A Gem Active Record já tem um suporte integrado para MySQL, PostgreSQL e SQLite3 através de adaptadores. É possível usar outros bancos como Oracle, SQLServer etc mas talvez seja necessário o uso de gems
Caso tenha interesse em saber mais sobre o ActiveRecord, pode encontrar informações interessantes na documentação da gem no github
Este está sendo o primeiro artigo que estou escrevendo. Agredeço pelo tempo que tirou para ler!
Posted on October 23, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.