两个看似相同的查询(据我这样的新手所知,但第一个在部分模板渲染时间中总体上更快(除了 ids 语句之外没有其他更改)。此外,当通过 rails 控制台进行测试时,后者将明显运行查询,而前者不会。我不明白为什么 - 以及为什么第一个语句比第二个语句快几毫秒 - 尽管我可以猜测这是由于较短的方法链接以获得相同的结果。
更新:我的坏。它们没有运行相同的查询,但仍然有趣的是,对所有列的选择比对一列的选择更快。不过,与方法链接相比,也许差异可以忽略不计。
ids = current_user.activities.map(&:person_id).reverse
SELECT "activities".* FROM "activities" WHERE "activities"."user_id" = 1
SELECT "people".* FROM "people" WHERE "people"."id" IN (1, 4, 12, 15, 3, 14, 17, 10, 5, 6) Rendered activities/_activities.html.haml (7.4ms)
ids = current_user.activities.order('id DESC').select{person_id}.map(&:person_id)
SELECT "activities"."person_id" FROM "activities" WHERE "activities"."user_id" = 1 ORDER BY id DESC
SELECT "people".* FROM "people" WHERE "people"."id" IN (1, 4, 12, 15, 3, 14, 17, 10, 5, 6) Rendered activities/_activities.html.haml (10.3ms)
该语句的目的是按照人员在活动表中出现的顺序(在其 PK 上)检索对人员的外键引用。注意:我使用 Squeel 进行 SQL。
在第一个查询中,您链接了 .map 和 .reverse,而在第二个查询中,您使用了 .order('id DESC') .select(person_id),如果您添加了 .reverse