Sobes.tech
Middle

Qual é a diferença entre Joins e Includes no Ruby on Rails?

sobes.tech IA

Resposta da IA

joins é utilizado para executar operadores JOIN em SQL, para selecionar dados com base em relações entre tabelas, mas apenas carregam as colunas do modelo principal.

includes é usado para resolver o problema de consultas N+1. Executa uma única consulta SQL com LEFT OUTER JOIN (se não houver condições nas associações incluídas), ou duas consultas SQL (uma para o modelo principal e outra para os relacionados), para carregar todos os dados dos modelos relacionados juntamente com o principal, evitando múltiplas consultas adicionais.

Diferenças principais:

  • Propósito: joins - filtragem/selecção com base em relações; includes - otimização do carregamento de dados relacionados (N+1).
  • Consulta SQL: joins - geralmente INNER JOIN (mas pode ser outro); includes - LEFT OUTER JOIN ou duas consultas separadas.
  • Carregamento de dados: joins - carrega apenas o modelo principal, os dados relacionados não estão disponíveis sem consultas adicionais; includes - carrega o modelo principal e os modelos relacionados.
  • Acesso a dados relacionados: Após joins, o acesso a dados relacionados requer consultas adicionais. Após includes, o acesso a dados relacionados não requer consultas adicionais.
# Exemplo de uso de joins
# Encontrar utilizadores que tenham pelo menos uma publicação
User.joins(:posts)
# Exemplo de uso de includes
# Carregar todos os utilizadores e as suas publicações numa ou duas consultas
User.includes(:posts).each do |user|
  user.posts.each do |post|
    # Acesso ao post sem consulta adicional
    puts post.title
  end
end

A escolha entre joins e includes depende da tarefa: se precisa apenas de filtrar registos do modelo principal com base em dados relacionados, use joins. Se precisar obter o modelo principal juntamente com os dados relacionados para uso posterior sem problemas N+1, use includes.