O que é Pattern
Design Patterns ou padrões de projetos são soluções generalistas para problemas recorrentes durante o desenvolvimento de um software. Não se trata de um framework ou um código pronto, mas de uma definição de alto nível de como um problema comum pode ser solucionado
O que é Repository
Faz a mediação entre o domínio e as camadas de mapeamento de dados usando uma interface semelhante a coleção para acessar objetos de domínio.
Qual problema Resolve
- Modelos inchados
- Teste unitários
- Dependency Injection
Pontos positivos
- Chamadas de banco de dados separadas da lógica de negócios
- Interface agradável, descritiva e facilmente testável
- Modelos e controladores finos
- Responsabilidades únicas
- Separação de preocupações
Melhor Ainda
- Divida repositórios em consultas e comandos
- Construa suas próprias entidades
- Livre-se completamente do ActiveRecord
Como aplicar no meu porjeto
class Post < ActiveRecord::Base
has_many :comments, dependent: :destroy
end
class PostRepository
end
Refatorando o codigo
class PostsController < ApplicationController
def index
render Post.list
end
def show
render Post.show_with_domain(id)
end
end
class Post < ActiveRecord::Base
has_many :comments, dependent: :destroy
def self.list
self.select('posts.*, count(comments.id)')
.joins(:comments)
.order(created_at: :desc)
end
def self.show_with_domain(id)
post = self.where(id: id)
comments = self.joins(:comments)
.where(id: id)
post.comments = comments
end
end
class PostsController < ApplicationController
def index
render PostRepository.list
end
def show
render PostRepository.show_with_domain(id)
end
end
class Post < ActiveRecord::Base
has_many :comments, dependent: :destroy
belongs_to :author
end
class PostRepository
class self
def list
Post.select('posts.*, count(comments.id), authors.name')
.joins(:comment)
.joins(:author)
.order(created_at: :desc)
end
def show_with_domain(id)
post = self.where(id: id)
comments = self.joins(:comments)
.where(id: id)
post.comments = comments
end
end
end
Referências
https://www.monterail.com/blog/repository-pattern-active-record
Neste curso, ele utiliza a model com alguns metodos simples e cria um repositorio para colocar a regra de negocio, de instalação de atualização.
https://www.destroyallsoftware.com/screencasts/catalog/what-goes-in-active-recordshttps://www.destroyallsoftware.com/screencasts/catalog/what-goes-in-active-records-part-2
Apenas a descrição conseitual do Pattern
https://martinfowler.com/eaaCatalog/repository.html
Para de carregar o Active records no model e carrega parte dele no repository e parte no model
https://www.youtube.com/watch?v=36LB8bfEeVc
Neste, não tem nenhum codigo no modelo, apenas no repositoy
https://www.monterail.com/blog/repository-pattern-active-record
Neste, utiliza o repository junto com interfaces e registry
Exemplo em Laravel - PHP
https://www.youtube.com/watch?v=CqsJPn6uNB8https://www.youtube.com/watch?v=93ZhGkFIwbA
Livros
https://www.oreilly.com/library/view/patterns-of-enterprise/0321127420/
Livros

