当仅显示大量数据(超过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
及其限制。但是出于多种原因,我不想返回所有客户。
我如何对所有记录进行排序,而只返回分页的子集?
答案 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),则只会得到该页面的数据。
在第二种情况下,您实际上是在编写limit
,offset
和where
({limit
和offset
仍然是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
您可以尝试这些,它们会很好地工作。您也可以自定义
如果答案有帮助,您可以接受。