Sobes.tech
Middle

Was ist der Unterschied zwischen Joins und Includes in Ruby on Rails?

sobes.tech KI

Antwort von AI

joins wird verwendet, um SQL-JOIN-Operatoren auszuführen, um Daten basierend auf Beziehungen zwischen Tabellen auszuwählen, lädt aber nur die Spalten des Hauptmodells.

includes wird verwendet, um das N+1-Abfrageproblem zu lösen. Es führt entweder eine einzelne SQL-Abfrage mit LEFT OUTER JOIN aus (wenn keine Bedingungen für die eingeschlossenen Assoziationen vorliegen), oder zwei SQL-Abfragen (eine für das Hauptmodell, eine für die verbundenen), um alle Daten der verbundenen Modelle zusammen mit dem Hauptmodell zu laden und so mehrere zusätzliche Abfragen zu vermeiden.

Wichtige Unterschiede:

  • Zweck: joins - Filtern/Auswahl basierend auf Beziehungen; includes - Optimierung des Ladens verbundener Daten (N+1).
  • SQL-Abfrage: joins - in der Regel INNER JOIN (kann aber auch anders sein); includes - LEFT OUTER JOIN oder zwei separate Abfragen.
  • Datenladen: joins - lädt nur das Hauptmodell, verbundene Daten sind ohne zusätzliche Abfragen nicht zugänglich; includes - lädt das Hauptmodell und die verbundenen Modelle.
  • Zugriff auf verbundene Daten: Nach joins erfordert der Zugriff auf verbundene Daten zusätzliche Abfragen. Nach includes ist kein zusätzlicher Abfrageaufwand notwendig.
# Beispiel für die Verwendung von joins
# Finde Benutzer, die mindestens einen Beitrag haben
User.joins(:posts)
# Beispiel für die Verwendung von includes
# Lade alle Benutzer und ihre Beiträge in einer oder zwei Abfragen
User.includes(:posts).each do |user|
  user.posts.each do |post|
    # Zugriff auf den Beitrag ohne zusätzliche Abfrage
    puts post.title
  end
end

Die Wahl zwischen joins und includes hängt von der Aufgabe ab: Wenn nur Datensätze des Hauptmodells basierend auf verbundenen Daten gefiltert werden sollen, verwenden Sie joins. Wenn das Hauptmodell zusammen mit den verbundenen Daten für eine spätere Verwendung ohne N+1-Probleme geladen werden soll, verwenden Sie includes.