Sobes.tech
Middle

Mi a különbség a Joins és az Includes között a Ruby on Rails-ben?

sobes.tech MI

Válasz az MI-től

A joins az SQL JOIN műveletek végrehajtására szolgál, hogy az adatok a táblák közötti kapcsolatok alapján legyenek kiválasztva, de csak a fő modell oszlopait tölti be.

Az includes az N+1 lekérdezési problémák megoldására szolgál. Vagy egy SQL lekérdezést hajt végre LEFT OUTER JOIN-nal (ha nincs feltétel a kapcsolt asszociációkra), vagy két SQL lekérdezést (egy a fő modellhez, egy a kapcsolódóhoz), hogy betöltse az összes kapcsolódó modell adatait a fő modell mellett, elkerülve a sok további lekérdezést.

Fő különbségek:

  • Cél: joins - kapcsolatok szerinti szűrés/választás; includes - a kapcsolódó adatok betöltésének optimalizálása (N+1).
  • SQL lekérdezés: joins - általában INNER JOIN (de lehet más is); includes - LEFT OUTER JOIN vagy két külön lekérdezés.
  • Adatok betöltése: joins - csak a fő modellt tölti be, a kapcsolódó adatok nem elérhetők további lekérdezés nélkül; includes - betölti a fő modellt és a kapcsolódó modelleket.
  • Hozzáférés a kapcsolódó adatokhoz: A joins után a kapcsolódó adatokhoz további lekérdezések szükségesek. Az includes után a kapcsolódó adatokhoz további lekérdezések nélkül lehet hozzáférni.
# Példa joins használatára
# Keress felhasználókat, akiknek van legalább egy posztjuk
User.joins(:posts)
# Példa includes használatára
# Töltsd be az összes felhasználót és posztjaikat egy vagy két lekérdezéssel
User.includes(:posts).each do |user|
  user.posts.each do |post|
    # Hozzáférés a poszthoz további lekérdezés nélkül
    puts post.title
  end
end

A joins és includes közötti választás a feladattól függ: ha csak a fő modell rekordjait szeretnéd szűrni kapcsolt adatok alapján, használd a joins-t. Ha a fő modellt a kapcsolódó adatokkal együtt szeretnéd lekérni későbbi felhasználásra N+1 problémák nélkül, használd az includes-t.