Область применения случайного порядка с нумерацией страниц - PullRequest
3 голосов
/ 18 июня 2011

Я пытаюсь выяснить, как создать область, которая будет возвращать случайные ActiveRecords, в то же время поддерживая will_paginate.

Прямо сейчас каждый просмотр страницы получает совершенно другой случайный набор ActiveRecords.Таким образом, каждая ссылка нумерации страниц - это на самом деле просто еще один случайный набор записей.

Как я могу настроить область видимости так, чтобы это был случайный порядок, сохраняющийся при разбиении на страницы?

Я предполагаючто мне нужно какое-то семя, основанное на времени?

1 Ответ

2 голосов
/ 18 июня 2011

Я предполагаю, что вы используете ORDER BY RAND() в своем SQL для получения случайного порядка. Если да, то вы можете предоставить начальное число для генератора случайных чисел :

RAND(), RAND(N)

[...] Если задан постоянный целочисленный аргумент N , он используется в качестве начального значения, которое создает повторяющуюся последовательность значений столбца.

Так что вам просто нужно выбрать начальное число (возможно, даже используя seed = rand(1e6) или что-то подобное в вашем коде Ruby) и отследить это начальное значение в сеансе. Затем для следующей страницы вытащите начальное значение из сеанса и передайте его функции MySQL RAND.

Имейте в виду, что ORDER BY RAND() (с семенем или без него) не самая дешевая операция на планете. Если ваша таблица для поиска небольшая, вы можете сгенерировать таблицу с кучей столбцов, заполнить ее случайными числами (вероятно, сгенерированными RAND) и присоединиться к этой таблице, чтобы обеспечить случайную последовательность для упорядочения. Вы могли бы предоставлять разные последовательности для разных средств просмотра, выбирая разные столбцы из таблицы случайных чисел: для одного пользователя вы сортируете по столбцу 11 таблицы / матрицы случайных чисел, а другой пользователь будет использовать столбец 23. Имейте в виду, что таблицы (с первичным key) на самом деле являются просто функциями в конечной области (и наоборот), поэтому выбор, который вы выбираете, часто является лишь деталью реализации. Реализация RAND с использованием таблицы, как правило, будет довольно громоздкой, но я все равно решил упомянуть эту опцию.

...