Sobes.tech
Middle

Ruby on Rails'ta Joins жана Includes арасындагы айырма эмне?

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 колдонуу керек.