рд░реЗрд▓ рд╣рдореЗрдВ рд╕рдВрдШреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 4 рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ: рдкреНрд░реАрд▓реЛрдб, рдЙрддреНрд╕реБрдХ_рд▓реЛрдб, рд╢рд╛рдорд┐рд▓ рдФрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдкреНрд░реАрд▓реЛрдб
рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рдВрдШреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИ:
User.preload(:posts).to_a
рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рдкреНрд░реАрд▓реЛрдб рд╣рдореЗрд╢рд╛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрд░реЛрдз рдмрдирд╛рддрд╛ рд╣реИ, рд╣рдо рдЪрдпрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреЛрд╕реНрдЯ рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
User.preload(:posts).where("posts.desc='ruby is awesome'")
рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ - рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
User.preload(:posts).where("users.name='Neeraj'")
рд╢рд╛рдорд┐рд▓
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреНрд░реАрд▓реЛрдб рдХреА рддрд░рд╣ рд╣реА рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕рдВрдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдХреЛрдИ рд╢рд░реНрдд рд╣реИ, рддреЛ рдпрд╣ LEFT OUTER JOIN рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рдХреНрд╡реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИред
User.includes(:posts).where('posts.desc = "ruby is awesome"').to_a
рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рдЖрдк рд╕рдВрджрд░реНрдн рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
User.includes(:posts).references(:posts).to_a
Eager_load
рдпрд╣ рд╡рд┐рдзрд┐ рд▓реЗрдлреНрдЯ рдЖрдЙрдЯрд░ рдЬреЙрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╣реА рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рдВрдШреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИ, рдЬреИрд╕реЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред
User.eager_load(:posts).to_a
рдореЗрдВ рд╢рд╛рдорд┐рд▓
INNER JOIN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХреНрд╡реЗрд░реА рдмрдирд╛рддрд╛ рд╣реИред
User.joins(:posts)
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХреНрд╡реЗрд░реА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд▓реМрдЯрд╛ рд╕рдХрддреА рд╣реИ:
def self.setup User.delete_all Post.delete_all u = User.create name: 'Neeraj' u.posts.create! title: 'ruby', desc: 'ruby is awesome' u.posts.create! title: 'rails', desc: 'rails is awesome' u.posts.create! title: 'JavaScript', desc: 'JavaScript is awesome' u = User.create name: 'Neil' u.posts.create! title: 'JavaScript', desc: 'Javascript is awesome' u = User.create name: 'Trisha' end
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ User.joins (: рдкреЛрд╕реНрдЯ) рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:
рд╣рдо рдЕрд▓рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ:
User.joins(:posts).select('distinct users.*').to_a
рдпрджрд┐ рд╣рдо рдкреЛрд╕реНрдЯ рдЯреЗрдмрд▓ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдЪрдпрди рдЦрдВрдб рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
records = User.joins(:posts).select('distinct users.*, posts.title as posts_title').to_a records.each do |user| puts user.name puts user.posts_title end
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЬреЙрдЗрди рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, user.post рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдФрд░ рдЕрдиреБрд░реЛрдз рд╣реЛрдЧрд╛ред
рдореВрд▓ рд▓реЗрдЦ