2010-02-18 97 views
2

对于类似论坛的应用程序我需要能够向每个用户显示未读(新)消息。为此目的有没有Rails插件/宝石?Rails:管理读取/未读消息

或者:是否有任何暗示以高效的方式完成这项工作?我正在考虑为每个用户存储每条消息的未读状态(或读状态?)的额外数据库表。但是,这似乎是穷举法,也许有一个聪明的解决方案...

+0

有关您的消息结构的更多信息将是有用的。消息是否像Twitter?任何人都可以按任何顺序阅读任何消息?他们喜欢论坛帖子吗?消息按顺序读取?他们喜欢电子邮件吗?哪里只有一个人会阅读每封邮件? – EmFi 2010-02-18 18:22:49

+0

这些消息就像论坛帖子。许多用户正在创建主题并回复主题(都称为“帖子”)。我想为每个用户显示一个提示,如“有5个主题和新消息”。 我觉得像这样的表: UnreadMessages: - topic_id:整数 - USER_ID:整数 但是,如果有arey很多用户还是很多的话题,这个表将是相当大的。如果有1000个用户,则每个新帖子都必须插入1000条记录。 AFAIR有这样的事情的Rails插件,但我无法找到它,我不知道正在使用什么数据库结构。 – 2010-02-19 06:20:38

+0

有趣的想法在这里找到: http://stackoverflow.com/questions/1997399/how-do-forums-show-you-unread-topics “维护一个表包含所有线程和该线程中的最新帖子每个用户都看过。“ – 2010-02-19 07:33:32

回答

12

在此期间我有基于我的想法创建了一个Rails插件,但使用了更多改进的算法。看看这里:
http://github.com/ledermann/unread

+0

为我节省了很多工作。只有当用户上次阅读后才能显示发布为“已编辑”的用户才会更好。我会分叉和玩它。再次感谢很多=) – Kansha 2013-02-05 10:46:12

6

向谁可能关注

最良好的祝愿, 乔治,这里是我的解决方案。我添加了一个新表来存储读取状态。该表中的一行给出了用户在给定主题中迄今阅读的帖子数量。 如果一个主题有更多的帖子,然后用户已经阅读,它被称为“未读”主题。

用法:

# Get number of unread posts of the logged-in user: 
Discussion.unread_by(current_user).count 
# => 42 

# Mark a topic as read 
some_topic = Discussion.find(x) 
some_topic.read_by!(current_user) 

简单的模型 “ReadStatus”:

class ReadStatus < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :discussion 

    validates_presence_of :user_id, :discussion_id, :post_count 
end 

摘自模式 “讨论” 保存主题和帖子:

class Discussion < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :topic, :class_name => 'Discussion', :foreign_key => 'discussion_id' 

    named_scope :unread_by, lambda { |user| 
     { :joins => "LEFT JOIN read_statuses ON (read_statuses.user_id = #{user} AND 
               read_statuses.discussion_id = discussions.id)", 
     :conditions => "discussions.discussion_id IS NULL 
         AND (read_statuses.user_id IS NULL) OR (read_statuses.post_count < discussions.post_count)", 
     :order => 'discussions.updated_at DESC' 
     } 
    } 


    def read_by!(user) 
    if read_status = ReadStatus.first(:conditions => { :user_id => user.id, :discussion_id => self.id }) 
     read_status.update_attributes! :post_count => self.post_count 
    else 
     ReadStatus.create! :user_id => user.id, :discussion_id => self.id, :post_count => self.post_count 
    end 
    end 
end