【发布时间】:2013-10-19 19:06:06
【问题描述】:
有这样的代码(使用PublicActivity gem & Squeel)
def index
@activities = Activity.limit(20).order { created_at.desc }
@one = @activities.where{trackable_type == 'Post'}.includes(trackable: [:author, :project])
@two = @activities.where{trackable_type == 'Project'}.includes trackable: [:owner]
@activities = @one + @two
end
但它会创建 8 个 SQL 请求:
SELECT "activities".* FROM "activities" WHERE "activities"."trackable_type" = 'Post' ORDER BY "activities"."created_at" DESC LIMIT 20
SELECT "posts".* FROM "posts" WHERE "posts"."id" IN (800, 799, 798, 797, 796, 795, 794, 793, 792, 791, 790, 789, 788, 787, 786, 785, 784, 783, 782, 781)
SELECT "users".* FROM "users" WHERE "users"."id" IN (880, 879, 878, 877, 876, 875, 874, 873, 872, 871, 869, 868, 867, 866, 865, 864, 863, 862, 861, 860)
SELECT "projects".* FROM "projects" WHERE "projects"."id" IN (80, 79)
SELECT "activities".* FROM "activities" WHERE "activities"."trackable_type" = 'Project' ORDER BY "activities"."created_at" DESC LIMIT 20
SELECT "projects".* FROM "projects" WHERE "projects"."id" IN (80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61)
SELECT "users".* FROM "users" WHERE "users"."id" IN (870, 859, 848, 837, 826, 815, 804, 793, 782, 771, 760, 749, 738, 727, 716, 705, 694, 683, 672, 661)
- 活动请求未加入
- 某些用户(帖子所有者和项目所有者)加载了两次
- 某些项目加载了两次
- @activities 是数组。 Rails 关系合并方法(
+除外)不适用于上述代码。
有什么优化它的想法吗?
【问题讨论】:
-
您始终可以在 Rails 中执行原始查询。只需构造sql字符串,然后就可以在请求端解析返回的数据集了……这比做8次查询要快得多
-
1) 这不是轨道方式。 2)我对SQL不是很好,不知道最后应该如何查询视图:)
-
Hmmmmmmmmmmm,不同意它不是轨道方式。千篇一律的查询之外的任何内容,无论如何您都必须使用自定义 where 子句。辅助函数只是增加了一点抽象性和可移植性
-
@Chris 你能提示完成的 SQL 查询应该是什么样子吗?
-
我的回答有帮助吗?
标签: sql ruby-on-rails activerecord rails-activerecord squeel