Не пересматривать увиденные посты в Rails - PullRequest
0 голосов
/ 14 октября 2010

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

В настоящее время я использую этот код в модели для отображения случайной страницы:

   def self.random
       if (c = count) != 0
         find(:first, :offset =>rand(c))
       end
   end

Система аутентификации пользователя построена на основе Authlogicи у меня есть модели User, Post и View.

Так что, если пользователь уже видел сообщение "foo", как бы мне не отображать его в будущем и вместо этого показывать случайную "полосу".

Спасибо

Ответы [ 2 ]

0 голосов
/ 15 октября 2010

Вы можете сохранить массив просмотренных идентификаторов постов в сеансе в действии 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
0 голосов
/ 14 октября 2010

Стив,

Я бы установил логическое поле для каждого сообщения, которое называется «read» (по умолчанию => false).

После запуска действия «show» вашего контроллера (и любого другого действия, которое вы считаете лицом, видящим публикацию), вы можете автоматически установить для него значение true и выполнить сохранение без проверки. Когда вы затем показываете свой список записей, вы можете добавить условие .where("read = ?", false).

Конечно, вы можете решить, хотите ли вы предоставить пользователям возможность устанавливать отдельные сообщения как "невидимые" или "непрочитанные" - если вы хотите сделать это, это тема другого вопроса:).

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