不要在Rails中重新显示已发布的帖子

时间:2010-10-14 19:20:37

标签: ruby-on-rails model random

我目前正在开发一个应用程序,用户点击一个按钮,然后他们会提供一个新的内容页面,并且想知道我将如何隐藏或跳过用户已经与之交互的内容(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”。

由于

2 个答案:

答案 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