Sobes.tech
Middle

რა განსხვავებაა Ruby on Rails-ში 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.