2010-10-14 4 views
0

Je développe actuellement une application dans laquelle un utilisateur clique sur un bouton et on lui propose une nouvelle page de contenu, et je me demandais comment je pourrais cacher ou ignorer ceux qui l'utilisateur a déjà interagi avec (une table séparée stocke le post_id et l'user_id pour chaque vue).Ne pas montrer commenté les posts dans Rails

J'utilise actuellement ce code dans le modèle pour afficher une page au hasard:

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

Le système d'authentification de l'utilisateur est construit hors de Authlogic, et je dois l'utilisateur, des postes et des modèles de vue.

Donc, si un utilisateur a déjà vu un message "foo", comment ne pas l'afficher dans le futur et servir une "barre" aléatoire.

Merci

Répondre

0

Steve,

Je mettrais un champ booléen pour chaque poste appelé "lecture" (par défaut => false). Après avoir déclenché l'action "show" de votre contrôleur (et toute autre action que vous considérez comme la personne voyant la publication), vous pouvez automatiquement mettre cette action à true et effectuer une sauvegarde sans validation. Lorsque vous affichez votre liste d'enregistrements, vous pouvez ajouter la condition .where("read = ?", false). Bien sûr, vous pouvez décider si vous souhaitez donner aux utilisateurs la possibilité de définir des messages individuels comme étant «invisibles» ou «non lus». Si vous voulez faire cela, c'est l'objet d'une autre question :).

+0

Comment cela fonctionnerait-il avec beaucoup d'utilisateurs à un seul article cependant? Cette méthode fonctionnerait-elle avec l'affichage des posts un à la fois, par opposition à une liste de tous les articles? Merci. – wastedhours

0

Vous pouvez stocker un tableau d'identifiants de posts consultés sur la session dans l'action show du posts_controller. EDIT - trouver un message aléatoire qui n'a pas encore été vu. Non testé, mais l'idée est ici:

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 

Voulez-vous conserver un enregistrement des messages affichés entre les sessions?

EDIT: Si vous souhaitez conserver un enregistrement au niveau de l'utilisateur des messages affichés entre les sessions, vous souhaiterez probablement le faire au niveau de la base de données. Comme cela signifie une relation plusieurs-à-plusieurs entre les utilisateurs et les publications, vous voudrez probablement gérer cela avec une table relationnelle, et la meilleure façon de le faire dans Rails est avec has_many :through. Quelque chose comme (encore, non testé):

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

Salut Dave, merci pour la réponse. On dirait une bonne approche. Oui, j'aimerais conserver un registre des posts consultés entre les sessions si possible. Merci. – wastedhours

Questions connexes