Рельсы случайной активной записи с нумерацией страниц - PullRequest
1 голос
/ 03 июня 2010

Мне нужно найти все записи для определенного ресурса и отобразить их в случайном порядке, но с постоянной разбивкой на страницы (вы не увидите одну и ту же запись дважды, если начнете разбивать страницы на страницы). Порядок отображения должен быть рандомизирован каждый раз, когда пользователь посещает страницу. Я использую will_paginate . Любой совет?

Ответы [ 5 ]

5 голосов
/ 03 ноября 2011

Сохраните случайное число в файлах cookie сеанса пользователя, а затем используйте его в качестве начального числа для случайной функции вашей базы данных. Так будет до тех пор, пока пользователь не закроет свой браузер, и, таким образом, все они будут видеть случайные, непротиворечивые записи:

Получите большое случайное число:

cookies[:seed] = SecureRandom.random_number.to_s[2..20].to_i

Используйте это семя с напр. MySQL:

SomeModel.all.order("RAND ?", cookies[:seed])
2 голосов
/ 04 июня 2010

Это не стандартно, насколько мне известно. Я вижу использование этого, например, для онлайн-тестов.

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

Я надеюсь, что количество строк ограничено, и тогда это будет иметь смысл, например, для тестов. Кроме того, когда пользователь покидает тест, прежде чем завершить его полностью, она может продолжить с того места, где он остановился. Но, возможно, это не относится к вам.

Надеюсь, это поможет.

1 голос
/ 08 декабря 2010

Не уверен, если вам все еще нужна помощь с этим. Одно из решений, которое я сделал в прошлом, - это выполнить запрос с помощью RAND, но сначала без нумерации страниц. Затем сохраните эти идентификаторы записи и используйте этот сохраненный список для поиска и разбивки на страницы. Начальный запрос RAND может быть настроен на запуск только в том случае, если страница имеет значение 1 или ноль. Просто мысль.

1 голос
/ 04 июня 2010

Если вы используете базу данных, такую ​​как MySQL, с функцией рандомизации, такой как RAND(), вы можете просто добавить ее к своему запросу на нумерацию страниц следующим образом:

Resource.paginate( ... :order => "RAND()" ... )

Ознакомьтесь с некоторыми комментариями, касающимися проблем производительности: https://rails.lighthouseapp.com/projects/8994/tickets/1274-patch-add-support-for-order-random-in-queries

0 голосов
/ 24 марта 2016

Я остановился на этом решении, которое работало для меня на Postgres:

session[:seed] ||= rand() # should be between [-1..1]
seed = session[:seed] 
Product.select("setseed(#{seed})").first
Product.order('random()').limit(10).offset(params[:offset])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...