Entendendo Active Record, a Gem do Rails e o Design Pattern

Luiz Fernando Puri - Oct 23 - - Dev Community

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)
Enter fullscreen mode Exit fullscreen mode

Em vez de:

SELECT * FROM users WHERE age = 26 AND favorite_color = blue AND country_id = 55;
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

E também definir condições para essas validações ou adicionar validações customizadas através dos métodos:

if, unless e validate
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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!

.