Rails分页 - 总页数更快?

时间:2017-09-18 17:40:57

标签: ruby-on-rails ruby database activerecord kaminari

我使用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%') 

我该怎么做才能加快速度?

2 个答案:

答案 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>