Бесконечная прокрутка страниц в ruby ​​на рельсах с одним запросом на страницу? - PullRequest
3 голосов
/ 12 августа 2011

Проблема с вашим типичным драгоценным камнем рельсов заключается в том, что он выполняет 2 запроса: один для страницы, на которой вы находитесь, и один для общего количества. Если вам не важно, сколько страниц (например, в бесконечной прокрутке), этот второй запрос не нужен (просто добавьте 1 к предложению LIMIT в первом запросе, и вы узнаете, есть ли еще или нет). *

Есть ли драгоценный камень, который будет выполнять пагинацию без второго запроса? Второй запрос стоит дорого, если применить неиндексированные фильтры в моем предложении WHERE к большим наборам данных, а индексация всех моих различных фильтров недопустима, потому что мне нужны быстрые вставки.

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 августа 2011

Разобрался. Используя гем will_paginate, вы можете указать свой собственный параметр total_entries для AR: Base.paginate. Это позволяет избежать выполнения второго запроса.

Это работает для достаточно больших наборов данных, когда вас интересуют только последние записи.

Это не обязательно приемлемо, если вы действительно рассчитываете достичь конца списка, потому что, если размер списка делится на per_page, вы будете запрашивать пустой набор в последнем запросе. С бесконечной прокруткой это нормально. При ручной кнопке «загрузить больше» вы будете отображать «загрузить больше» в самом конце, когда больше нет элементов для загрузки.

0 голосов
/ 13 августа 2011

Стандартный подход, как вы определили, заключается в получении N + 1 записей, когда вам нужно N, и если в ответ вы получаете больше N записей, есть как минимум одна дополнительная страница результатов, которую вы можете отобразить.

Единственная причина, по которой вы хотите сделать явный вызов COUNT(*), заключается в том, что вам нужно точно знать, сколько еще записей вам нужно будет извлечь.На некоторых движках это может занять много времени для вычислений, поэтому лучше избегать этого, особенно если значение никогда не используется напрямую.

Поскольку это так просто, вам действительно не нужен плагин для этого,Плагины типа will_paginate больше заботятся о количестве доступных страниц, поэтому они выполняют операцию подсчета.

...