Забавная вещь о «случайном» состоит в том, что он обычно не чувствует себя случайным, когда вы получаете один и тот же ответ дважды подряд.
Обычный ответ на эту проблему - создать очередь ответов и убедиться, что при добавлении записей в очередь их еще нет в очереди. Это может быть либо очередь записей, которые вы будете возвращать пользователю, либо очередь записей, которые у вас уже возвращены пользователю. Мне нравится ваша идея использовать идентификаторы записей, но только с 25 записями этот повторяющийся цикл также будет раздражать. :)
Вы можете отслеживать очередь предыдущих записей в memcached, если у вас уже есть одна развернутая или вы можете вставить очередь в сеанс (вероятно, это будет всего пять или шесть целых чисел, не слишком большая передача данных) или база данных.
Я думаю, что я бы избегал базы данных, потому что она не обязательно должна быть постоянной, ей не нужно брать пропускную способность базы данных или время вычислений, и использование базы данных только для отслеживания пяти или шести целых чисел кажется глупо. :)
UPDATE:
В одном из ваших контроллеров (возможно, ApplicationController
) добавьте что-то вроде этого в метод, который вы запускаете в before_filter
:
class ApplicationController < ActionController::Base
before_filter :find_quip
def find_quip:
last_quip_id = session[:quip_id] || Quips.find(:first).id
new_quip_id = Quips.find(last_quip.id + 1).id || Quips.find(:first)
session[:quip_id] = new_quip
end
end
Я не очень доволен кодом, который нужно обернуть, когда у тебя кончились клеветы; он полностью облажается, если в последовательности есть дыра. Что, вероятно, когда-нибудь случится. И это начнется с номера 2. Но я слишком устал, чтобы разобраться. :)