我目前正在开发一个应用程序,用户点击一个按钮,然后他们会提供一个新的内容页面,并且想知道我将如何隐藏或跳过用户已经与之交互的内容(a单独的表存储每个视图的post_id和user_id。
我目前在模型中使用此代码来显示随机页面:
def self.random
if (c = count) != 0
find(:first, :offset =>rand(c))
end
end
用户身份验证系统由Authlogic构建,我有User,Post和View模型。
因此,如果用户已经看过帖子“foo”,我将来怎么会不显示它,而是提供一个随机的“bar”。
由于
答案 0 :(得分:0)
史蒂夫,
我会为每个名为“read”的帖子设置一个布尔字段(默认=> false)。
在触发控制器的“显示”操作(以及您认为该人看到帖子的任何其他操作)后,您可以自动将其设置为true并执行保存而无需验证。然后,当您显示记录列表时,可以添加条件.where("read = ?", false)
。
当然,您可以决定是否要让用户灵活地将单个帖子设置为“看不见”或“未读” - 如果您想这样做,则是另一个问题的主题:)。
答案 1 :(得分:0)
您可以在posts_controller的show动作中在会话中存储一系列已查看的帖子ID。编辑 - 找到尚未查看的随机帖子。没有经过测试,但想法就在这里:
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 :through。像(再次,未经测试)的东西:
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