Вы можете сохранить массив просмотренных идентификаторов постов в сеансе в действии show posts_controller. РЕДАКТИРОВАТЬ - найти случайный пост, который еще не просматривался. Не проверено, но идея здесь:
def show_random_post
while (id == nil || (session[:viewed_posts] ||= []).include?(id)) # initialize array if it hasn't been initialized
id = rand(Post.count) + 1
end
session[:viewed_posts] << id
@post = Post.find(id)
# etc.
end
Хотите вести учет просмотренных сообщений между сессиями?
РЕДАКТИРОВАТЬ: Если вы хотите вести учет просмотренных сообщений между сеансами на уровне пользователя, вы, вероятно, захотите сделать это на уровне БД. Так как это означает отношения «многие ко многим» между пользователями и публикациями, вы, вероятно, захотите управлять этим с помощью реляционной таблицы, и лучший способ сделать это в Rails - с has_many: через . Что-то вроде (опять не проверено):
class ViewedPostRecord < ActiveRecord::Base
belongs_to :user
belongs_to :post
end
class User < ActiveRecord::Base
has_many :viewed_post_records
has_many :viewed_posts, :class => 'Post', :through => :viewed_post_records
end
class PostsController < ApplicationController
def show_random_post
while (id == nil || current_user.viewed_posts.map(&:id).include?(id))
id = rand(Post.count) + 1
end
@post = Post.find(id)
current_user.viewed_posts << @post
# etc.
end
end