Ruby:对大量记录进行分页和排序

时间:2019-01-14 23:22:56

标签: ruby

当仅显示大量数据(超过10万条记录)时,我的代码运行良好,并且我在服务器上分页。

但是,当我需要对这些数据进行排序时,我陷入了困境。我只是在页面上排序,而不是在与该一位客户相关的所有记录上排序。

我该如何对客户的所有记录进行分页,但又不能对服务器端分页返回的记录进行简单的分类?

我还使用BootStrap Table来显示我的所有数据。

这是我的代码,可以吸引所有客户:

  def get_customers
    @data_to_return = []
    @currency = current_shop.country_currency
    customers = current_shop.customers.limit(records_limit).offset(records_offset)#.order("#{sort_by}" " " "#{sort_order}")
    customers.each do |customer|
      @data_to_return.push(
      state: false,
      id: customer.id,
      email: customer.email,
      accepts_marketing: customer.accepts_marketing,
      customer_status: customer.customer_status,
      tags: customer.tags)
    end
    sort_customers
  end

然后是sort_customers方法:

  def sort_customers
    fixed_data = data_to_return.sort_by {|hsh| hsh[sort_by]}
    customer_size = current_shop.customers.length
    if sort_order == "ASC"
      fixed_data
    else
      fixed_data.reverse!
    end
    render json: {"total": customer_size, "rows": fixed_data}
  end

在上面的代码中,您可以看到data_to_return来自get_customers及其限制。但是出于多种原因,我不想返回所有客户。

我如何对所有记录进行排序,而只返回分页的子集?

2 个答案:

答案 0 :(得分:0)

您实际上应该在模型/查询级别而不是在红宝石级别进行排序。

区别基本上是:

# sort in ruby
relation.sort_by { |item| foo(item) }

# sort in database - composes with pagination
relation.order('column_name ASC/DESC')

在第一种情况下,在调用sort_by之前,该关系被隐式执行,枚举并转换为数组 。如果您进行了分页(手动或使用kaminari),则只会得到该页面的数据。

在第二种情况下,您实际上是在编写limitoffsetwhere({limitoffset仍然是kaminari在幕后使用的) ,where是隐含的,当您将关联与order一起使用时,数据库便会执行

SELECT `customers`.`*` FROM `customers`
  WHERE ...
  OFFSET ...
  LIMIT ...
  ORDER BY ...

将返回正确的数据。

一个不错的选择是在模型中定义范围,例如

class Customer < ApplicationRecord
  scope :sorted_by_email, ->(ascending = true) { order("email #{ascending ? 'ASC' : 'DESC'}") }
end

# in controller
customers = current_shop.customers.
  limit(records_limit).
  offset(records_offset).
  sorted_by_email(false)

答案 1 :(得分:-1)

您可以使用客户端的数据表库解决排序和分页问题。这是一个Jquery库。使用此方法,您需要将所有数据加载到页面中,然后才能很好地工作。 以下是参考资料,请检查。 Data tables jquery libray

Data tables gem for rails

您可以尝试这些,它们会很好地工作。您也可以自定义

如果答案有帮助,您可以接受。