对于类似论坛的应用程序我需要能够向每个用户显示未读(新)消息。为此目的有没有Rails插件/宝石?Rails:管理读取/未读消息
或者:是否有任何暗示以高效的方式完成这项工作?我正在考虑为每个用户存储每条消息的未读状态(或读状态?)的额外数据库表。但是,这似乎是穷举法,也许有一个聪明的解决方案...
对于类似论坛的应用程序我需要能够向每个用户显示未读(新)消息。为此目的有没有Rails插件/宝石?Rails:管理读取/未读消息
或者:是否有任何暗示以高效的方式完成这项工作?我正在考虑为每个用户存储每条消息的未读状态(或读状态?)的额外数据库表。但是,这似乎是穷举法,也许有一个聪明的解决方案...
在此期间我有基于我的想法创建了一个Rails插件,但使用了更多改进的算法。看看这里:
http://github.com/ledermann/unread
为我节省了很多工作。只有当用户上次阅读后才能显示发布为“已编辑”的用户才会更好。我会分叉和玩它。再次感谢很多=) – Kansha 2013-02-05 10:46:12
向谁可能关注
最良好的祝愿, 乔治,这里是我的解决方案。我添加了一个新表来存储读取状态。该表中的一行给出了用户在给定主题中迄今阅读的帖子数量。 如果一个主题有更多的帖子,然后用户已经阅读,它被称为“未读”主题。
用法:
# 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
有关您的消息结构的更多信息将是有用的。消息是否像Twitter?任何人都可以按任何顺序阅读任何消息?他们喜欢论坛帖子吗?消息按顺序读取?他们喜欢电子邮件吗?哪里只有一个人会阅读每封邮件? – EmFi 2010-02-18 18:22:49
这些消息就像论坛帖子。许多用户正在创建主题并回复主题(都称为“帖子”)。我想为每个用户显示一个提示,如“有5个主题和新消息”。 我觉得像这样的表: UnreadMessages: - topic_id:整数 - USER_ID:整数 但是,如果有arey很多用户还是很多的话题,这个表将是相当大的。如果有1000个用户,则每个新帖子都必须插入1000条记录。 AFAIR有这样的事情的Rails插件,但我无法找到它,我不知道正在使用什么数据库结构。 – 2010-02-19 06:20:38
有趣的想法在这里找到: http://stackoverflow.com/questions/1997399/how-do-forums-show-you-unread-topics “维护一个表包含所有线程和该线程中的最新帖子每个用户都看过。“ – 2010-02-19 07:33:32