2010-10-14 36 views
0

我目前正在開發一個應用程序,用戶點擊一個按鈕,他們被提供了一個新的內容頁面,並想知道如何去隱藏或跳過那些用戶已與之交互(單獨的表存儲每個視圖的post_id和user_id)。不要在Rails中重新顯示看到的帖子

我目前使用此代碼在模型中顯示隨機頁面:

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

用戶認證系統是建立關閉Authlogic的,我有用戶,郵政和查看模型。

因此,如果用戶已經看過帖子「foo」,我將來怎麼不顯示它,而是提供一個隨機的「欄」。

感謝

回答

0

史蒂夫,

我會設置一個布爾字段名爲每個崗位 「讀取」(默認值=>假)。

當您觸發控制器的「顯示」操作(以及您認爲該人看到該帖子的任何其他操作)時,您可以自動將其設置爲true並在未驗證的情況下執行保存操作。當您顯示您的記錄列表時,您可以添加條件.where("read = ?", false)

當然,您可以決定是否要讓用戶將個人帖子設置爲「不可見」或「未讀」的靈活性 - 如果您想這樣做是另一個問題的主題:)。

+0

這將如何與許多用戶到單個帖子雖然?這種方法是否可以一次一個地顯示帖子,而不是所有帖子的列表?謝謝。 – wastedhours 2010-10-14 19:40:16

0

您可以在posts_controller的show動作中在會話中存儲查看的post標識數組。編輯 - 找到沒有查看過的隨機文章。未經測試,但主意在這裏:

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 
+0

嗨戴夫,謝謝你的答案。看起來像一個好方法。是的,如果可能的話,我希望在會話之間保留已查看帖子的記錄。謝謝。 – wastedhours 2010-10-15 07:51:40

相關問題