對於類似論壇的應用程序我需要能夠向每個用戶顯示未讀(新)消息。爲此目的有沒有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