Joins, includes, preload, and eager load in Rails
Bài đăng này đã không được cập nhật trong 6 năm
Rails cung cấp bốn cách khác nhau để load association data 1 preload: Luôn thực thi 2 câu lệnh riêng biệt.
Blog.preload(:posts)
Blog Load (3.2ms) SELECT "blogs".* FROM "blogs"
Post Load (1.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" IN (1, 2, 3)
- eager_load Chỉ thực hiện 1 query LEFT OUTER JOIN Join trước, và thực hiện where sau. Hoạt dộng giống như includes + references.
Blog.eager_load(:posts) SQL (0.4ms) SELECT "blogs"."id" AS t0_r0, "blogs"."name" AS t0_r1, "blogs"."author" AS t0_r2, "blogs"."created_at" AS t0_r3, "blogs"."updated_at" AS t0_r4, "posts"."id" AS t1_r0, "posts"."title" AS t1_r1, "posts"."created_at" AS t1_r2, "posts"."updated_at" AS t1_r3, "posts"."blog_id" AS t1_r4 FROM "blogs" LEFT OUTER JOIN "posts" ON "posts"."blog_id" = "blogs"."id"
Blog.eager_load(:posts).where(name: 'Blog 1') SQL (0.4ms) SELECT "blogs"."id" AS t0_r0, "blogs"."name" AS t0_r1, "blogs"."author" AS t0_r2, "blogs"."created_at" AS t0_r3, "blogs"."updated_at" AS t0_r4, "posts"."id" AS t1_r0, "posts"."title" AS t1_r1, "posts"."created_at" AS t1_r2, "posts"."updated_at" AS t1_r3, "posts"."blog_id" AS t1_r4 FROM "blogs" LEFT OUTER JOIN "posts" ON "posts"."blog_id" = "blogs"."id" WHERE "blogs"."name" = ? [["name", "Blog 1"]]
Blog.eager_load(:posts).where(name: 'Blog 1').where(posts: {title: 'Post 1-1'}) SQL (0.4ms) SELECT "blogs"."id" AS t0_r0, "blogs"."name" AS t0_r1, "blogs"."author" AS t0_r2, "blogs"."created_at" AS t0_r3, "blogs"."updated_at" AS t0_r4, "posts"."id" AS t1_r0, "posts"."title" AS t1_r1, "posts"."created_at" AS t1_r2, "posts"."updated_at" AS t1_r3, "posts"."blog_id" AS t1_r4 FROM "blogs" LEFT OUTER JOIN "posts" ON "posts"."blog_id" = "blogs"."id" WHERE "blogs"."name" = ? AND "posts"."title" = ? [["name", "Blog 1"], ["title", "Post 1-1"]]
- includes Hoạt động dựa trên tình huống: Giống như preload:
Blog.includes(:posts)
Blog Load (2.8ms) SELECT "blogs".* FROM "blogs"
Post Load (0.7ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" IN (1, 2, 3)
Blog.includes(:posts).where(name: 'Blog 1')
Blog Load (0.7ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."name" = ? [["name", "Blog 1"]]
Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" IN (1)
Hoạt đống giống preload:
Blog.includes(:posts).where(name: 'Blog 1').where(posts: {title: 'Post 1-1'})
SQL (0.2ms) SELECT "blogs"."id" AS t0_r0, "blogs"."name" AS t0_r1, "blogs"."author" AS t0_r2, "blogs"."created_at" AS t0_r3, "blogs"."updated_at" AS t0_r4, "posts"."id" AS t1_r0, "posts"."title" AS t1_r1, "posts"."created_at" AS t1_r2, "posts"."updated_at" AS t1_r3, "posts"."blog_id" AS t1_r4 FROM "blogs" LEFT OUTER JOIN "posts" ON "posts"."blog_id" = "blogs"."id" WHERE "blogs"."name" = ? AND "posts"."title" = ? [["name", "Blog 1"], ["title", "Post 1-1"]]
- joins
Blog.joins(:posts)
Blog Load (0.2ms) SELECT "blogs".* FROM "blogs" INNER JOIN "posts" ON "posts"."blog_id" = "blogs"."id"
Blog.joins(:posts).count
(0.3ms) SELECT COUNT(*) FROM "blogs" INNER JOIN "posts" ON "posts"."blog_id" = "blogs"."id"
=> 15
Blog.eager_load(:posts).count
(0.4ms) SELECT COUNT(DISTINCT "blogs"."id") FROM "blogs" LEFT OUTER JOIN "posts" ON "posts"."blog_id" = "blogs"."id"
=> 3
Blog.joins(:posts).each do |blog|
> puts blog.posts.map(&:title).join(', ')
> end
Blog Load (0.2ms) SELECT "blogs".* FROM "blogs" INNER JOIN "posts" ON "posts"."blog_id" = "blogs"."id"
Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 1]]
Post 1-1, Post 1-2, Post 1-3, Post 1-4, Post 1-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 1]]
Post 1-1, Post 1-2, Post 1-3, Post 1-4, Post 1-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 1]]
Post 1-1, Post 1-2, Post 1-3, Post 1-4, Post 1-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 1]]
Post 1-1, Post 1-2, Post 1-3, Post 1-4, Post 1-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 1]]
Post 1-1, Post 1-2, Post 1-3, Post 1-4, Post 1-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 2]]
Post 2-1, Post 2-2, Post 2-3, Post 2-4, Post 2-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 2]]
Post 2-1, Post 2-2, Post 2-3, Post 2-4, Post 2-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 2]]
Post 2-1, Post 2-2, Post 2-3, Post 2-4, Post 2-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 2]]
Post 2-1, Post 2-2, Post 2-3, Post 2-4, Post 2-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 2]]
Post 2-1, Post 2-2, Post 2-3, Post 2-4, Post 2-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 3]]
Post 3-1, Post 3-2, Post 3-3, Post 3-4, Post 3-5
Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 3]]
Post 3-1, Post 3-2, Post 3-3, Post 3-4, Post 3-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 3]]
Post 3-1, Post 3-2, Post 3-3, Post 3-4, Post 3-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 3]]
Post 3-1, Post 3-2, Post 3-3, Post 3-4, Post 3-5
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."blog_id" = ? [["blog_id", 3]]
Post 3-1, Post 3-2, Post 3-3, Post 3-4, Post 3-5
All rights reserved