1

アプリ用のカスタム コメント システムを構築しました。ユーザーがアクセスしてコメントを追加すると、他のユーザーがコメントに返信できるようになります。ここでは、フィールドbodycreated_atupdated_at、 、userを含む 1 つのテーブルのみが作成されますparent_id。そうは言っても、行に がある場合、parent_idそれは子コメントであることを意味し、そうでない場合は親コメントです。

現在、ユーザーが新しいコメントを追跡できる基本的な通知システム/エリアをセットアップしようとしています。子コメントの親コメントであるかどうかに関係なく、ユーザーが受け取った未読のコメントを表示できるように設定したいと考えています。githubのやり方に似たもの。

それで、どうすればいいですか?Comment最初は、テーブルにもう 1 つフィールドを追加することを考えていましたread。これはブール値であり、真かどうかに応じて通知が表示されます。しかし、ここでの問題は、この新しいコメントについてスレッド (すべての親と子のコメント) ですべてのユーザーに通知することです。

さて、この問題を解決するために他にどのようなアプローチをとればよいでしょうか?

私があなたを混乱させなかったことを願っています。

4

1 に答える 1

2

私のコメントのいくつか:

  1. コメントが読まれたかどうかを判断するのは難しく、不必要です。ここにコメントを残すと、このページに移動すると更新が表示されますが、それでも左上に通知が表示されます。

  2. 通知は、JS によって、またはより簡単な手動でマークされた既読によって、既読かどうかを判断できます。

  3. では、is_read は必要ありませんか? コメントのフィールド。コメントはすべて未読です。

最初にコメントで正しい関連付けを設定します。

より複雑で HABTM 関連付けが必要なネストされたスレッドがないとします。

class Comment < ActiveRecord::Base
  has_many :children, class_name: 'Comment'
  belongs_to :parent, class_name: 'Comment', foreign_key: 'parent_id'

  def related_comments
    parent.children - [self] if parent_id?
  end
end

次に、コールバック/オブザーバーを使用して処理します

簡単にするためにコールバックを使用します。これには別のクラスが関与するため、オブザーバーが推奨されます。

  after_save :send_unread_notification, if: :parent_id?

  private
  # or better to send it to a backend job if necessary
  def send_unread_notification
    related_comments.each do |c|
      notification = Notification.new{
                       notifier: c.user,
                       message: 'You have unread comment',
                       sender:  'comment',
                       sender_id: c.id }
      notification.save!
    end
  end

次に、通知クラスと UI を作成します

簡単にするために省略します。

于 2013-09-02T00:45:53.180 に答える