Sobes.tech
Middle

Тафовут байни Joins ва Includes дар Ruby on Rails чист?

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-ро истифода баред.