2010-02-18 102 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