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


https://refactoring.guru/


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

https://medium.com/@laertis.pappas/repository-pattern-in-ruby-i-decoupling-activerecord-and-persistence-e395e1b0cf69

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

![](https://i.imgur.com/hXSWilY.png =200x)

![](https://i.imgur.com/t4YZEuM.png =200x)