我的应用程序包含新闻,帖子,评论和其他各种常见内容。我希望能够跟踪用户观看的内容,以便他们可以通过“4个新帖子”和那种类型的东西来迎接。
目前,我只是用以下内容报告“新帖子”的数量:
Post.find(:all, :conditions => [ "updated_at > ?", session[:user_last_login]]).length
显然,这只是部分一样好。
在我把我的整个应用程序搞得一团糟之前,有什么最简单的方法可以实现我所描述的内容,并且rails有什么功能可以帮助我吗?
此外,这种功能是否有一个共同的名称可能有助于我的Google搜索?
感谢。
答案 0 :(得分:2)
一种相当典型的方法是跟踪用户上次查看特定对象(或对象集合)的时间。然后,如果您想要跟踪查看的对象上有created_at
或updated_at
,则可以计算自上次用户查看新闻以来更改的帖子数量项目
所以,你可能会有一个类:
class NewsItemTrack < ActiveRecord::Base
belongs_to :news_item
belongs_to :user
def self.track(news_item_id, user_id)
nt = self.find_by_news_item_id_and_user_id(news_item_id, user_id)
if nt.nil?
nt = self.create(:news_item_id => news_item_id, :user_id => user_id, :last_viewed_at => Time.now)
else
nt.update_attribute(:last_viewed_at, Time.now)
end
end
def new_comment_count
Comment.count(:all, :conditions => ['news_item_id = ? and created_at > ?', self.news_item_id, self.last_viewed_at]
end
end
NewsItemTrack.track
将记录用户查看相关新闻的事实。然后,当你想知道你要做的新闻项目有多少新评论时:
NewsItemTrack.find_by_news_item_id_and_user_id(123, 456).new_comment_count
答案 1 :(得分:1)
我会使用具有多态关系的连接表 - 使用插件(gem?)has_many_polymorphs。
您可以拥有一个名为“查看”的关联表和关联的模型“查看”。 h_m_p将为您提供诸如'seen_posts','Viewed_comments','Viewed_news'等方法(新闻是一个糟糕的模型名称,它应该是一个像NewsItem这样的单词,名为news_items,或类似的东西)。
主页的google has_many_polymorphs,有例子和东西。
答案 2 :(得分:1)
您可以查看Michael Bleigh的ActsAsReadable
答案 3 :(得分:0)
您需要跟踪用户查看了哪些帖子。如果用户必须按顺序查看帖子,您可以简单地跟踪最后看到的帖子。如果可以不按顺序查看它们,那么您需要保持一个关系,指示用户是否看过某个帖子。要获取“新”帖子,您可以选择当前用户在该表中没有匹配关系的帖子。显然,每当用户查看帖子时,您需要更新用于跟踪用户观看历史记录的列或关系。
答案 4 :(得分:0)
正是tvanfosson所说的。因为,当用户登录但不查看未读消息时,您的示例将失败。
将帖子的默认值设置为new
,并在第一次渲染时将其设置为viewed
。在Ruby on Rails中,第一个渲染通常是show
动作。