рд░реВрдмреА рдСрди рд░реЗрд▓реНрд╕ рдореЗрдВ рд╕рдВрдШреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЗ

рд░реЗрд▓ рд╣рдореЗрдВ рд╕рдВрдШреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 4 рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ: рдкреНрд░реАрд▓реЛрдб, рдЙрддреНрд╕реБрдХ_рд▓реЛрдб, рд╢рд╛рдорд┐рд▓ рдФрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдкреНрд░реАрд▓реЛрдб


рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рдВрдШреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИ:
User.preload(:posts).to_a # => SELECT "users".* FROM "users" SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN (1) 

рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рдкреНрд░реАрд▓реЛрдб рд╣рдореЗрд╢рд╛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрд░реЛрдз рдмрдирд╛рддрд╛ рд╣реИ, рд╣рдо рдЪрдпрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреЛрд╕реНрдЯ рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 User.preload(:posts).where("posts.desc='ruby is awesome'") # => SQLite3::SQLException: no such column: posts.desc: SELECT "users".* FROM "users" WHERE (posts.desc='ruby is awesome') 

рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ - рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 User.preload(:posts).where("users.name='Neeraj'") # => SELECT "users".* FROM "users" WHERE (users.name='Neeraj') SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN (3) 



рд╢рд╛рдорд┐рд▓


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреНрд░реАрд▓реЛрдб рдХреА рддрд░рд╣ рд╣реА рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕рдВрдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдХреЛрдИ рд╢рд░реНрдд рд╣реИ, рддреЛ рдпрд╣ LEFT OUTER JOIN рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рдХреНрд╡реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИред
 User.includes(:posts).where('posts.desc = "ruby is awesome"').to_a # => SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, "posts"."id" AS t1_r0, "posts"."title" AS t1_r1, "posts"."user_id" AS t1_r2, "posts"."desc" AS t1_r3 FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id" WHERE (posts.desc = "ruby is awesome") 

рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рдЖрдк рд╕рдВрджрд░реНрдн рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 User.includes(:posts).references(:posts).to_a # => SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, "posts"."id" AS t1_r0, "posts"."title" AS t1_r1, "posts"."user_id" AS t1_r2, "posts"."desc" AS t1_r3 FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id" 


Eager_load


рдпрд╣ рд╡рд┐рдзрд┐ рд▓реЗрдлреНрдЯ рдЖрдЙрдЯрд░ рдЬреЙрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╣реА рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рдВрдШреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИ, рдЬреИрд╕реЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред

 User.eager_load(:posts).to_a # => SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, "posts"."id" AS t1_r0, "posts"."title" AS t1_r1, "posts"."user_id" AS t1_r2, "posts"."desc" AS t1_r3 FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id" 


рдореЗрдВ рд╢рд╛рдорд┐рд▓


INNER JOIN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХреНрд╡реЗрд░реА рдмрдирд╛рддрд╛ рд╣реИред
 User.joins(:posts) # => SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХреНрд╡реЗрд░реА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд▓реМрдЯрд╛ рд╕рдХрддреА рд╣реИ:
 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 id: 9, name: "Neeraj"> #<User id: 9, name: "Neeraj"> #<User id: 9, name: "Neeraj"> #<User id: 10, name: "Neil"> 

рд╣рдо рдЕрд▓рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ:
 User.joins(:posts).select('distinct users.*').to_a #   ,    : User.joins(:posts).uniq 

рдпрджрд┐ рд╣рдо рдкреЛрд╕реНрдЯ рдЯреЗрдмрд▓ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдЪрдпрди рдЦрдВрдб рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
 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 рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдФрд░ рдЕрдиреБрд░реЛрдз рд╣реЛрдЧрд╛ред

рдореВрд▓ рд▓реЗрдЦ

Source: https://habr.com/ru/post/In191762/


All Articles