预加载数据以加快视图加载时间 - rails
Preloading data to speed up view load time - rails
我正在研究 rails 加快加载时间的技术。我现在正在处理一个在渲染时渲染大量数据的页面。我正在尝试逐步完成每个负载,看看是否可以优化时间。
我目前遇到的问题是这个;
(5.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23022]]
(4.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23023]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23024]]
(6.0ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23029]]
(7.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23121]]
(6.0ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23180]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23229]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23250]]
(6.6ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23254]]
(4.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23255]]
(4.0ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23259]]
(6.5ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23154]]
(6.6ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23177]]
(5.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23201]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23221]]
(4.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23232]]
(7.9ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23235]]
(4.3ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23237]]
(4.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23238]]
(5.9ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23248]]
(7.8ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23295]]
(6.8ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23119]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23123]]
(4.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23178]]
(7.9ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23231]]
(4.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23239]]
(4.3ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23240]]
(6.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23241]]
(5.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23243]]
(6.7ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23245]]
(4.3ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23247]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23249]]
(6.9ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23251]]
(4.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23256]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23257]]
(6.5ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23275]]
(6.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23350]]
(5.0ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23272]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23296]]
(4.0ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23401]]
(8.8ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23347]]
我是从这段代码中得到的:
def number_attending
rsvp.attendees.count
end
所以RSVPS有很多参加者。我在这里调用那个方法。
<% rsvps.each do |rsvp| %>
<span class="event-response__indicator event-response__indicator--guests" title="<%= rsvp.number_attending %> Guests">
<% end %>
所以问题来了。我不想在页面加载时遍历每个 rsvp 和与会者。有没有办法预加载该数据。像 Eagerloading 这样的东西?如果是这样,我如何根据给定的信息实施它?
好吧,你没有说明你是如何查询 rsvps 的,所以我会认为它是 rsvps = Rsvp.all
。你可以只添加一个 includes
方法,所以它会像这样 rsvps = Rsvp.includes(:attendees).all
.
另外我不确定它是否会在 运行 这一行 rsvp.attendees.count
时避免查询。我 运行 遇到 count
方法触发查询但 size
方法没有触发查询的情况,因此您可能必须将此行替换为 rsvp.attendees.size
.
查看 this link,
这专门用于避免 n+1 次查询计数。
这解释了如何执行连接查询或为其创建视图
我正在研究 rails 加快加载时间的技术。我现在正在处理一个在渲染时渲染大量数据的页面。我正在尝试逐步完成每个负载,看看是否可以优化时间。
我目前遇到的问题是这个;
(5.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23022]]
(4.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23023]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23024]]
(6.0ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23029]]
(7.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23121]]
(6.0ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23180]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23229]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23250]]
(6.6ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23254]]
(4.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23255]]
(4.0ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23259]]
(6.5ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23154]]
(6.6ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23177]]
(5.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23201]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23221]]
(4.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23232]]
(7.9ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23235]]
(4.3ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23237]]
(4.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23238]]
(5.9ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23248]]
(7.8ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23295]]
(6.8ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23119]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23123]]
(4.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23178]]
(7.9ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23231]]
(4.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23239]]
(4.3ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23240]]
(6.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23241]]
(5.1ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23243]]
(6.7ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23245]]
(4.3ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23247]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23249]]
(6.9ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23251]]
(4.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23256]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23257]]
(6.5ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23275]]
(6.4ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23350]]
(5.0ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23272]]
(4.2ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23296]]
(4.0ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23401]]
(8.8ms) SELECT COUNT(*) FROM "attendees" WHERE "attendees"."rsvp_id" = [["rsvp_id", 23347]]
我是从这段代码中得到的:
def number_attending
rsvp.attendees.count
end
所以RSVPS有很多参加者。我在这里调用那个方法。
<% rsvps.each do |rsvp| %>
<span class="event-response__indicator event-response__indicator--guests" title="<%= rsvp.number_attending %> Guests">
<% end %>
所以问题来了。我不想在页面加载时遍历每个 rsvp 和与会者。有没有办法预加载该数据。像 Eagerloading 这样的东西?如果是这样,我如何根据给定的信息实施它?
好吧,你没有说明你是如何查询 rsvps 的,所以我会认为它是 rsvps = Rsvp.all
。你可以只添加一个 includes
方法,所以它会像这样 rsvps = Rsvp.includes(:attendees).all
.
另外我不确定它是否会在 运行 这一行 rsvp.attendees.count
时避免查询。我 运行 遇到 count
方法触发查询但 size
方法没有触发查询的情况,因此您可能必须将此行替换为 rsvp.attendees.size
.
查看 this link, 这专门用于避免 n+1 次查询计数。
这解释了如何执行连接查询或为其创建视图