Quelle est la différence entre Joins et Includes dans Ruby on Rails?
sobes.tech IA
Réponse de l'IA
joins est utilisé pour effectuer des opérations JOIN en SQL, afin de sélectionner des données basées sur des relations entre les tables, mais ne chargent que les colonnes du modèle principal.
includes est utilisé pour résoudre le problème des requêtes N+1. Il exécute une seule requête SQL avec LEFT OUTER JOIN (si aucune condition sur les associations incluses), ou deux requêtes SQL (une pour le modèle principal et une pour les liés), pour charger toutes les données des modèles liés avec le principal, évitant ainsi plusieurs requêtes supplémentaires.
Différences clés :
- Objectif :
joins- filtrage/sélection basé sur des relations ;includes- optimisation du chargement des données liées (N+1). - Requête SQL :
joins- généralement INNER JOIN (mais peut être autre) ;includes- LEFT OUTER JOIN ou deux requêtes séparées. - Chargement des données :
joins- ne charge que le modèle principal, les données liées ne sont pas accessibles sans requêtes supplémentaires ;includes- charge le modèle principal et les modèles liés. - Accès aux données liées : Après
joins, l'accès aux données liées nécessite des requêtes supplémentaires. Aprèsincludes, l'accès aux données liées ne nécessite pas de requêtes supplémentaires.
# Exemple d'utilisation de joins
# Trouver des utilisateurs ayant au moins un post
User.joins(:posts)
# Exemple d'utilisation de includes
# Charger tous les utilisateurs et leurs posts en une ou deux requêtes
User.includes(:posts).each do |user|
user.posts.each do |post|
# Accès au post sans requête supplémentaire
puts post.title
end
end
Le choix entre joins et includes dépend de la tâche : si vous souhaitez simplement filtrer les enregistrements du modèle principal par des données liées, utilisez joins. Si vous souhaitez obtenir le modèle principal avec ses données liées pour une utilisation ultérieure sans problème N+1, utilisez includes.