我使用Kaminari gem为我的搜索分页:
@outfits = Outfit.where("description LIKE ?", "%warm%").page(params[:page]).per(20)
使用此代码决定是否显示更多内容:
<% unless @outfits.current_page == @outfits.total_pages %>
<p id="view-more">
<%= link_to('View More', url_for(page: @outfits.current_page + 1), remote: true) %>
</p>
<% end %>
问题是,比较当前页面是否是最后一页在加载时间方面是昂贵的。我的数据库中有数百万套服装,因此活动记录计数时间平均超过600毫秒:
(616.9ms) SELECT COUNT(*) FROM "outfits" WHERE (desc LIKE '%warm%')
我该怎么做才能加快速度?
答案 0 :(得分:3)
简短的回答并非如此。如果您要根据用户输入运行LIKE
次查询,则您必须以任何方式对其进行计数,以便判断用户是否在最后一页上。
通过利用elasticsearch-rails
等文本搜索引擎,您可以大大加快搜索时间。 https://github.com/elastic/elasticsearch-rails。设置它需要一些开销,但是如果你有数百万条记录,可能值得一试。
如果你可以启动并运行,你可以从索引中获得结果计数,与使用LIKE
查询点击Postgres相比,这应该是快速的。
答案 1 :(得分:0)
您是否考虑过尝试使用#last_page?
或#next_page?
?
例如
<!-- <% if @outfits.next_page? %> -->
<% unless @outfits.last_page? %>
<p id="view-more">
<%= link_to 'View More', path_to_next_page(@outfits), remote: true %>
</p>
<% end %>
此外,您可以查看kaminari
's suggestion的大型数据集,这些数据集基本上不计算,默认情况下,如果下一页没有更多结果,它将不会呈现任何内容。
e.g。
@outfits = Outfit.where("description LIKE ?", "%warm%")
.page(params[:page])
.per(20)
.without_count
然后在你看来:
<p id="view-more">
<%= link_to_next_page @outfits, 'View More', remote: true do %>
<span> No More Pages </span>
<% end %>
</p>