Ruby: разбивать на страницы и сортировать большое количество записей - PullRequest
0 голосов
/ 15 января 2019

При простом отображении больших объемов данных (более 100 тыс. Записей) мой код работает хорошо, и я выполняю пагинацию на сервере.

Однако, когда мне нужно отсортировать эти данные, я застреваю. Я сортирую только по странице, а НЕ сортирую по ВСЕМ записям, связанным с этим одним клиентом.

Как я могу разбивать на страницы, а также сортировать по всем записям моего клиента, а НЕ просто сортировать записи, возвращаемые с нумерации на стороне сервера?

Я также использую 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 голосов
/ 17 января 2019

На самом деле вы должны сортировать на уровне модели / запроса, а не на уровне рубина.

Разница в основном:

# 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)
0 голосов
/ 15 января 2019

Вы можете решить проблему сортировки и разбивки на страницы, используя библиотеку таблиц данных, которая находится на стороне клиента. Это библиотека Jquery. Используя это вам нужно загрузить все данные на страницу, тогда это будет работать очень хорошо. Ниже приведены ссылки, пожалуйста, проверьте. Таблицы данных jquery libray

Таблица данных драгоценный камень для рельсов

Вы можете попробовать это, они будут работать очень хорошо. Вы также можете настроить его

Если ответ полезен, вы можете принять его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...