[英]How to send notifications to all commentors on polymorphic comments in rails?
我正在使用多態關聯進行評論。 我想向所有評論帖子的用戶發送通知。
評論.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.