Sobes.tech
Middle

Kāda ir atšķirība starp Joins un Includes Ruby on Rails?

sobes.tech AI

Atbilde no AI

joins tiek izmantots SQL JOIN operatoru izpildei, lai izvēlētos datus, pamatojoties uz saistībām starp tabulām, bet tajā pašā laikā tiek ielādēti tikai galvenā modeļa kolonnas.

includes tiek izmantots N+1 vaicājumu problēmas risināšanai. Tas veic vai nu vienu SQL vaicājumu ar LEFT OUTER JOIN (ja nav iekļauto saistību nosacījumu), vai divus SQL vaicājumus (viens galvenajam modelim, otrs saistītajiem), lai ielādētu visus saistīto modeļu datus kopā ar galveno, izvairoties no daudzām papildu vaicājumu izpildes.

Galvenās atšķirības:

  • Mērķis: joins - filtrēšana/atlasīšana, pamatojoties uz saistībām; includes - saistīto datu ielādes optimizācija (N+1).
  • SQL vaicājums: joins - parasti INNER JOIN (bet var būt arī cits); includes - LEFT OUTER JOIN vai divi atsevišķi vaicājumi.
  • Datu ielāde: joins - ielādē tikai galveno modeli, saistītie dati nav pieejami bez papildu vaicājumiem; includes - ielādē galveno modeli un saistītos modeļus.
  • Piekļuve saistītajiem datiem: Pēc joins piekļuve saistītajiem datiem izraisa papildu vaicājumus. Pēc includes piekļuve saistītajiem datiem nesagādā papildu vaicājumus.
# Piemērs, izmantojot joins
# Atrodi lietotājus, kuriem ir vismaz viens ieraksts
User.joins(:posts)
# Piemērs, izmantojot includes
# Ielādē visus lietotājus un viņu ierakstus vienā vai divās vaicājumos
User.includes(:posts).each do |user|
  user.posts.each do |post|
    # Piekļuve ierakstam bez papildu vaicājuma
    puts post.title
  end
end

Izvēle starp joins un includes ir atkarīga no uzdevuma: ja nepieciešams vienkārši filtrēt galvenā modeļa ierakstus pēc saistītajiem datiem, izmantojiet joins. Ja nepieciešams iegūt galveno modeli kopā ar saistītajiem datiem to turpmākai izmantošanai bez N+1 problēmām, izmantojiet includes.