Kuo skiriasi Joins ir Includes Ruby on Rails?
sobes.tech AI
Atsakymas iš AI
joins naudojamas SQL JOIN operatoriams vykdyti, kad pasirinktumėte duomenis remiantis ryšiais tarp lentelių, tačiau tuo pačiu metu įkelia tik pagrindinio modelio stulpelius.
includes naudojamas N+1 užklausų problemos sprendimui. Jis vykdo arba vieną SQL užklausą su LEFT OUTER JOIN (jei nėra sąlygų įtrauktoms asociacijoms), arba dvi SQL užklausas (vieną pagrindiniam modeliui, kitą susijusiems), kad įkeltų visus susijusių modelių duomenis kartu su pagrindiniu, išvengiant daugybės papildomų užklausų.
Pagrindiniai skirtumai:
- Paskirtis:
joins- filtravimas/paieška remiantis ryšiais;includes- susijusių duomenų įkėlimo optimizavimas (N+1). - SQL užklausa:
joins- paprastai INNER JOIN (bet gali būti ir kitoks);includes- LEFT OUTER JOIN arba dvi atskiros užklausos. - Duomenų įkėlimas:
joins- įkelia tik pagrindinį modelį, susiję duomenys nėra prieinami be papildomų užklausų;includes- įkelia pagrindinį modelį ir susijusius modelius. - Prieiga prie susijusių duomenų: Po
joinsprieiga prie susijusių duomenų sukelia papildomas užklausas. Poincludesprieiga prie susijusių duomenų nesukelia papildomų užklausų.
# Pavyzdys naudojant joins
# Rasti vartotojus, turinčius bent vieną įrašą
User.joins(:posts)
# Pavyzdys naudojant includes
# Įkelti visus vartotojus ir jų įrašus vienu arba dviem užklausomis
User.includes(:posts).each do |user|
user.posts.each do |post|
# Prieiga prie įrašo be papildomos užklausos
puts post.title
end
end
Pasirinkimas tarp joins ir includes priklauso nuo užduoties: jei reikia tik filtruoti pagrindinio modelio įrašus pagal susijusius duomenis, naudokite joins. Jei norite gauti pagrindinį modelį kartu su susijusiais duomenimis jų vėlesniam naudojimui be N+1 problemų, naudokite includes.