will_paginate и проблемы с поздним смещением строк

Может быть, я делаю предположение с темой этого вопроса, но вот ситуация. У меня есть довольно большая таблица — 5,4 миллиона строк — в mysql, за моим приложением Rails 4. Я использую таблицы данных и поиск. Все это хорошо, но драгоценный камень will_paginate убивает нашу производительность.

orders = Order.not_pending.where("azonref like :search or sales_channel like :search", search: "%#{params[:sSearch]}%")
orders = orders.distinct.order("#{sort_column} #{sort_direction}")

# this next line is the killer
orders = orders.page(page).per_page(per_page)

Я считаю, что это из-за mysql и проблемы с «поздним смещением строк», но как этого избежать, поскольку will_paginate генерирует sql?


person phil    schedule 15.02.2017    source источник
comment
Если вы используете таблицы данных, вам следует использовать их источник данных, чтобы справиться с этим. Разбиение на страницы поверх таблиц данных не является хорошей идеей, поскольку оно обрабатывает разбиение на страницы через собственное разбиение на страницы.   -  person dstull    schedule 16.02.2017
comment
Вы должны проверить приходящий массив ордеров, активна запись или нет, и массив это или что-то не так   -  person Dmitriy Gusev    schedule 16.02.2017
comment
@dstull - у вас есть ссылки на какие-либо примеры (или вы хотите сформулировать ответ на этот вопрос)? Все примеры RoR/Datatables, которые я нашел, используют will_paginate.   -  person phil    schedule 16.02.2017


Ответы (1)


Вот ваши варианты для лучшего использования dataTables здесь с рельсами:

  1. удалите разбивку на страницы и полностью полагайтесь на использование dataTables - у этого есть недостаток, заключающийся в том, что все помещается в дом, что приведет к замедлению передачи этих данных в дом более 3 МБ или около того. Вот пример использования этого:конкретный js звони - но смотри весь проект

  2. используйте источник данных либо как источник ajax, либо как ajax с отложенным рендерингом. Я думаю, что последнее может быть интересно для вас:

источник ajax с рельсами (используйте опцию «ajax» при инициализации dataTables:

"ajax": { "url": "/sample/get_url/" + "некоторые параметры", "dataSrc": '' }

отложенный рендеринг:
https://datatables.net/examples/ajax/defer_render.html< /а>

person dstull    schedule 19.02.2017
comment
Спасибо. Мы не можем отправить клиенту 300 000 строк данных. Мы уже делаем ваше второе предложение. Код в вопросе взят из нашего объекта данных Rails, который загружается через ajax. Это не проблема. Проблема в пагинации. Возможно, это вопрос не о таблицах данных, а вопрос will_paginate. - person phil; 22.02.2017