Каква е разликата между 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.