簡體   English   中英

如何在rails中向所有評論者發送關於多態評論的通知?

[英]How to send notifications to all commentors on polymorphic comments in rails?

我正在使用多態關聯進行評論。 我想向所有評論帖子的用戶發送通知。

  • 假設user1發布了一個帖子。
  • User2對此發表評論。
  • User1收到通知 (users = User.joins(:posts).where(:posts => {id: params[:post_id]})) “ User2 發表了評論
  • 再次, User1評論。
  • 現在, User2應該收到通知(users= ????)
  • 如果用戶 2、用戶 3、用戶4發表評論,則所有相關用戶都應該收到通知。

評論.rb

class Comment < ApplicationRecord
    belongs_to  :user
    belongs_to :commentable, polymorphic: true
    has_many :comments, as: :commentable
    validates :comment, presence: true

    after_create :notifications
    def notifications
       #Create Notification             
       users =  ????
       (users-[@current_user]).each do |user|
        Resque.enqueue(NotifyJob, Notification.create(
        recipient: user,
        actor: @current_user,
        action: "posted",
        notifiable: @comment))
        end
    end

end

用戶名

 class User < ApplicationRecord
   has_many :posts, dependent: :destroy
   has_many :comments, as: :commentable, dependent: :destroy
   has_many :notifications, foreign_key: :recipient_id, dependent: :destroy
 end

后.rb

 class Post < ApplicationRecord
    belongs_to :user
    validates :comment, presence: true
    validates :user_id, presence: true
    has_many :comments, as: :commentable
 end

評論控制器.rb

module Api 
module V1
    class CommentsController < ApplicationController
        skip_before_action :verify_authenticity_token
        before_action :authorize_request
        before_action :find_commentable

        def new
            @comment = Comment.new
        end

        def create
            @comment = @commentable.comments.new(comment_params)
            @comment.user = @current_user

            if @comment.save
                render json: @comment, status: :created

            else
                render json: { errors: @comment.errors.full_messages },
                status: :unprocessable_entity
            end
        end

        def show
            @comment = Comment.find(params[:id])
            if !@comment.nil?
                render json: @comment, status: :ok
            else
                render json: {errors: @comment.errors.full_messages}, status: :unprocessable_entity
            end
        end

        private

        def comment_params
            params.permit(:comment)
        end

        def find_commentable
            @commentable = Comment.find_by_id(params[:comment_id]) if params[:comment_id]
            @commentable = Post.find_by_id(params[:post_id]) if params[:post_id]
        end
    end
end
end

你的第一個問題是在User模型中。 你有

has_many :comments, as: :commentable, dependent: :destroy

但是Comment模型belongs_to :user並且有user_id ,這意味着在User

has_many :comments, dependent: :destroy

在這種情況下,您可以使用User.first.comments輕松獲取所有用戶評論

第二個是回調。 Vyacheslav Loginov 關於將這種復雜邏輯置於控制器操作中的錯誤做法是正確的,但回調也不是好的做法。 不確定他們中的哪個更糟。 您將在每次評論創建時創建通知,即使是從控制台。 將在您創建 commnet 的每個測試設置中創建通知。 不確定這是否是您真正想要的。

更好的選擇是創建單獨的 ServiceObject 來處理通知

class CommentsController < ApplicationController
  def create
    @comment = @commentable.comments.new(comment_params)
    @comment.user = @current_user

    if @comment.save
      NotificationSender.new(@comment).comment_notification
      render json: @comment, status: :created
    else
      render json: { errors: @comment.errors.full_messages },
      status: :unprocessable_entity
    end
  end
end

class NotificationSender
  def initialize(resource)
    @resource = resource
  end

  # you can add here all other notifications as methods
  def comment_notification
    users = User.where(id: @resource.commentable.comments.pluck(:user_id)).
                 where.not(id: @resource.user_id)
    users.each do |user|
      Resque.enqueue(
        NotifyJob, 
        Notification.create(
          recipient: user,
          actor: @resource.user,
          action: "posted",
          notifiable: @resource
        )
      )
    end
  end
end

我沒有做太多改變。 我只是做了這樣的改變:

評論.rb

class Comment < ApplicationRecord
   belongs_to  :user
   belongs_to :commentable, polymorphic: true
   has_many :comments, as: :commentable
   validates :comment, presence: true

   private
   after_commit :create_notifications, on: [:create]
   #Create Notification
   def create_notifications 
     commentable = self.commentable 
     commentors= Comment.where(commentable: commentable).pluck(:user_id)
     users = User.find(commentors)-[self.user]
       users.each do |user|    
         Resque.enqueue(NotifyJob, Notification.create(
         actor: self.user,
         recipient: user,
         action: "posted",
         notifiable: self.commentable))
       end
   end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM