Sobes.tech
Middle

Ruby on Rails'da Joins va Includes o'rtasidagi farq nima?

sobes.tech AI

AIdan javob

joins SQL JOIN operatsiyalarini bajarish uchun ishlatiladi, jadvallar orasidagi bog'liqliklar asosida ma'lumotlarni tanlash uchun, lekin faqat asosiy modelning ustunlarini yuklaydi.

includes N+1 so'rov muammosini hal qilish uchun ishlatiladi. U LEFT OUTER JOIN bilan bitta SQL so'rovini bajaradi (agar qo'shilgan bog'lanishlar uchun shartlar bo'lmasa), yoki ikkita SQL so'rovi (birinchisi asosiy model uchun, ikkinchisi bog'langanlar uchun), barcha bog'langan modellar ma'lumotlarini asosiy model bilan birga yuklab, qo'shimcha so'rovlar sonini kamaytiradi.

Asosiy farqlar:

  • Maqsad: joins - bog'liqliklar asosida filtratsiya/ tanlov; includes - bog'langan ma'lumotlarni yuklashni optimallashtirish (N+1).
  • SQL so'rovi: joins - odatda INNER JOIN (lekin boshqacha bo'lishi mumkin); includes - LEFT OUTER JOIN yoki ikki alohida so'rov.
  • Ma'lumotlarni yuklash: joins - faqat asosiy modelni yuklaydi, bog'langan ma'lumotlar qo'shimcha so'rovlar bilan mavjud emas; includes - asosiy model va bog'langan modellarni yuklaydi.
  • Bog'langan ma'lumotlarga kirish: joins dan so'ng, bog'langan ma'lumotlarga kirish qo'shimcha so'rovlarni talab qiladi. includes dan so'ng, bog'langan ma'lumotlarga kirish qo'shimcha so'rovlarni talab qilmaydi.
# joins misoli
# Kamida bitta postga ega bo'lgan foydalanuvchilarni topish
User.joins(:posts)
# includes misoli
# Barcha foydalanuvchilar va ularning postlarini bitta yoki ikki so'rovda yuklash
User.includes(:posts).each do |user|
  user.posts.each do |post|
    # qo'shimcha so'rovsiz postga kirish
    puts post.title
  end
end

joins va includes tanlovi vazifaga bog'liq: agar faqat bog'langan ma'lumotlar asosida asosiy model yozuvlarini filtrlash kerak bo'lsa, joins ni ishlating. Agar asosiy model bilan bog'langan ma'lumotlarni keyinchalik N+1 muammosiz olish uchun olish kerak bo'lsa, includes ni ishlating.