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
joinsdostęp do powiązanych danych wymaga dodatkowych zapytań. Poincludesdostę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.