如何加快Rails控制器查询?

问题描述 投票:0回答:2

我的应用程序可能陷入困境。有人可以帮助我优化此控制器代码以使其运行得更快吗?或指出正确的方向。谢谢。

if current_user.manager?
  get_customers = Customer.where(:archived => false)
  @cc = get_customers.where(:active => true)
  @current_customers = @cc.where(:user_id => current_user.id)
  @count_current = @current_customers.count

  @pc = get_customers.where(:active => false)
  @potential_customers = @pc.where(:user_id => current_user.id)
  @count_potential = @potential_customers.count
end
ruby-on-rails activerecord ruby-on-rails-5
2个回答
1
投票

在单个查询中加载所有可用记录可能会非常昂贵。而且,用户可能只对最近的几个记录(即博客中的最​​新帖子)感兴趣,而不想等待所有记录的加载和呈现。

有几种方法可以解决此问题

Load More的示例#1实现

Infinite Scrolling的示例#2实现

pagination的示例#3实现


0
投票

您可能会找到帮助here

正如@Gabbar指出的那样,我将添加到它中,您的应用现在是eager-loading(与[[lazy-loading相反)),这意味着您正在从数据库中加载比所需更多的东西。我们需要做的是优化,但这完全取决于您的用例。

无论用例如何,您都可以做一些普通的事情来使事情变得更好:您可以实现分页(有很多功能,您也可以自己做)或无限滚动。在这种情况下,您将首先从db加载一定数量的记录,但一旦用户需要更多记录,它们将向下滚动或单击“下一步”按钮,并且将再次调用您的操作,但页面会增加数字,表示获取下一组记录。

基于滚动的实现涉及JS和视图高度等,但是分页要简单得多。

宝石:

kaminari gem

infinite-pages

使用includes

您必须做的另一件事是,如果您的记录相关,则在查询中使用include。使用include很难,但是在节省时间方面非常有帮助。它将多次从数据库中一次性获取相关的所需记录,这与您的代码多次来回数据库不同。与从RAM进行获取相比,从数据库进行获取要花费大量时间。

@@ users = User.all.includes(:comments)#与用户一起带来但已保存在RAM中以供将来访问的所有用户的注释。@comments = @ users.map(&:comments)#无需再次进入db,只需进入RAM。

© www.soinside.com 2019 - 2024. All rights reserved.