Разбивайте рандомизированный список постов в блоге, используя will_paginate - PullRequest
5 голосов
/ 01 мая 2009

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

Я не могу реализовать это так:

@posts = Post.paginate :page => params[:page], :order => 'RANDOM()'

, поскольку параметр :order вызывается при каждом запросе, и поэтому я рискую повторить сообщения в блоге.

Какой лучший способ сделать это?

Ответы [ 4 ]

3 голосов
/ 06 мая 2009

RAND принимает начальное значение в MySQL:

RAND(N) 

Из документов MySQL :

RAND (), RAND (N)

Возвращает случайное значение с плавающей точкой v в диапазоне 0 <= v <1,0. Если Постоянный целочисленный аргумент N является указано, это используется в качестве семени значение, которое производит повторяемое последовательность значений столбцов. в В следующем примере обратите внимание, что последовательности значений, создаваемых RAND (3), одинаковы в обоих местах, где это происходит. </p>

Другие базы данных должны иметь аналогичную функциональность.

Если вы используете SAME seed при каждом вызове RAND, порядок будет одинаковым для всех запросов, и вы можете соответственно разбивать на страницы.

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

1 голос
/ 02 мая 2009

Чтобы на каждой странице (сгенерированной по новому запросу) не было повторяющихся постов, вам нужно хранить порядок постов где-то для поиска по нескольким запросам.

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

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

0 голосов
/ 01 мая 2009

Создайте именованную область действия в модели Post, которая инкапсулирует случайное поведение:

class Post < ActiveRecord::Base
  named_scope :random, :order => 'RANDOM()'
  .
  .
  .
end

Ваш PostsController код становится:

@posts = Post.random.paginate :page => params[:page]
0 голосов
/ 01 мая 2009

Вы можете: order => RANDOM () в исходном запросе, который заполняет @posts, а затем при разбивке на страницы не указывать порядок.

...