Sobes.tech
Middle

Ποια είναι η διαφορά μεταξύ Joins και Includes στο Ruby on Rails;

sobes.tech AI

Απάντηση από AI

Το joins χρησιμοποιείται για την εκτέλεση τελεστών SQL JOIN, ώστε να επιλέγονται δεδομένα βάσει των σχέσεων μεταξύ των πινάκων, αλλά φορτώνει μόνο τις στήλες του κύριου μοντέλου.

Το includes χρησιμοποιείται για την επίλυση του προβλήματος των ερωτημάτων N+1. Εκτελεί είτε ένα SQL ερώτημα με LEFT OUTER JOIN (αν δεν υπάρχουν συνθήκες στις συμπεριλαμβανόμενες συσχετίσεις), είτε δύο SQL ερωτήματα (ένα για το κύριο μοντέλο και ένα για τα συσχετισμένα), για να φορτώσει όλα τα δεδομένα των συσχετισμένων μοντέλων μαζί με το κύριο, αποφεύγοντας πολλαπλά επιπλέον ερωτήματα.

Βασικές διαφορές:

  • Σκοπός: joins - φιλτράρισμα/επιλογή βάσει σχέσεων; includes - βελτιστοποίηση της φόρτωσης συσχετισμένων δεδομένων (N+1).
  • SQL ερώτημα: joins - συνήθως INNER JOIN (αλλά μπορεί και διαφορετικά); includes - LEFT OUTER JOIN ή δύο ξεχωριστά ερωτήματα.
  • Φόρτωση δεδομένων: joins - φορτώνει μόνο το κύριο μοντέλο, τα συσχετισμένα δεδομένα δεν είναι διαθέσιμα χωρίς επιπλέον ερωτήματα; includes - φορτώνει το κύριο μοντέλο και τα συσχετισμένα μοντέλα.
  • Πρόσβαση σε συσχετισμένα δεδομένα: Μετά το joins, η πρόσβαση σε συσχετισμένα δεδομένα απαιτεί επιπλέον ερωτήματα. Μετά το includes, η πρόσβαση σε συσχετισμένα δεδομένα δεν απαιτεί επιπλέον ερωτήματα.
# Παράδειγμα χρήσης του joins
# Βρείτε χρήστες που έχουν τουλάχιστον μια ανάρτηση
User.joins(:posts)
# Παράδειγμα χρήσης του includes
# Φορτώστε όλους τους χρήστες και τις αναρτήσεις τους σε ένα ή δύο ερωτήματα
User.includes(:posts).each do |user|
  user.posts.each do |post|
    # Πρόσβαση στην ανάρτηση χωρίς επιπλέον ερώτημα
    puts post.title
  end
end

Η επιλογή μεταξύ joins και includes εξαρτάται από την εργασία: αν χρειάζεται απλώς να φιλτράρετε εγγραφές του κύριου μοντέλου βάσει συσχετισμένων δεδομένων, χρησιμοποιήστε το joins. Αν χρειάζεται να λάβετε το κύριο μοντέλο μαζί με τα συσχετισμένα δεδομένα για μελλοντική χρήση χωρίς προβλήματα N+1, χρησιμοποιήστε το includes.