Sobes.tech
Middle

Jaka jest różnica między Joins a Includes w Ruby on Rails?

sobes.tech AI

Odpowiedź od AI

joins jest używany do wykonywania operatorów JOIN w SQL, aby wybierać dane na podstawie relacji między tabelami, ale ładuje tylko kolumny głównego modelu.

includes służy do rozwiązania problemu zapytań N+1. Wykonuje jedno zapytanie SQL z LEFT OUTER JOIN (jeśli nie ma warunków na dołączone powiązania), lub dwa zapytania SQL (jedno dla głównego modelu, drugie dla powiązanych), aby załadować wszystkie dane powiązanych modeli razem z głównym, unikając wielu dodatkowych zapytań.

Kluczowe różnice:

  • Cel: joins - filtrowanie/wybór na podstawie relacji; includes - optymalizacja ładowania powiązanych danych (N+1).
  • Zapytanie SQL: joins - zazwyczaj INNER JOIN (ale może być inny); includes - LEFT OUTER JOIN lub dwa oddzielne zapytania.
  • Ładowanie danych: joins - ładuje tylko główny model, powiązane dane nie są dostępne bez dodatkowych zapytań; includes - ładuje główny model i powiązane modele.
  • Dostęp do powiązanych danych: Po joins dostęp do powiązanych danych wymaga dodatkowych zapytań. Po includes dostęp do powiązanych danych nie wymaga dodatkowych zapytań.
# Przykład użycia joins
# Znaleźć użytkowników, którzy mają co najmniej jeden post
User.joins(:posts)
# Przykład użycia includes
# Załadować wszystkich użytkowników i ich posty jednym lub dwoma zapytaniami
User.includes(:posts).each do |user|
  user.posts.each do |post|
    # Dostęp do posta bez dodatkowego zapytania
    puts post.title
  end
end

Wybór między joins a includes zależy od zadania: jeśli chcesz tylko przefiltrować rekordy głównego modelu na podstawie powiązanych danych, użyj joins. Jeśli chcesz uzyskać główny model wraz z powiązanymi danymi do późniejszego użycia bez problemu N+1, użyj includes.