我的webapp已注册用户,它也有文章,博客文章,闲话。 对于所有这些资源,我有一个多态的Comment模型,如下所示。
id content commentable_id commentable_type user_id created_at updated_at
1 Frist comment 2 Article 1 ....
2 Second comment 3 Post 2 .....
因此,对于每个可评论资源,我在可评论资源的底部都有一个评论表单供用户评论。 我想要一个复选框,在提交评论时选中,用户应该收到通知,无论是收件箱还是电子邮件,因为我们已经在用户注册时,以及稍后添加其他新评论。
我想要一些像Notifications这样的模型,我可以存储commentable_type,commentable_id和user_id(如果有匹配的commentable和user创建了新的评论,应该向谁发送通知?
如何实现评论和通知之间的关联?对于检查部分,如果有任何一个订阅特定可注释资源,则创建一个带有after_create挂钩的CommentObserver来初始化搜索,并在有任何匹配记录时发送通知。
但是我很困惑协会,模型,控制器和视图会是什么样子才能实现这一目标?由于评论模型已经是多态的,我可以将Notification模型创建为多态吗?
答案 0 :(得分:6)
您可以在没有插件的情况下轻松完成此操作。 创建数据库表以存储帖子的用户通知订阅。然后,每次创建评论时,查询数据库并使用ActionMailer向所有用户的地址发送电子邮件。
答案 1 :(得分:1)
第一步是为通知
创建一个新模型和控制器 $ rails g model Notification post:references comment:references user:references read:boolean
$ rake db:migrate
$ rails g controller Notifications index
完成此操作后,下一步是将has_many:notifications添加到User,Post和Comment模型。
完成此操作后,将以下代码添加到Comments模型中:
after_create :create_notification
private
def create_notification
@post = Post.find_by(self.post_id)
@user = User.find_by(@post.user_id).id
Notification.create(
post_id: self.post_id,
user_id: @user,
comment_id: self,
read: false
)
end
创建评论后,上述代码段会创建通知。 下一步是编辑Notifications控制器,以便删除通知,用户可以将通知标记为已读:
def index
@notifications = current_user.notications
@notifications.each do |notification|
notification.update_attribute(:checked, true)
end
end
def destroy
@notification = Notification.find(params[:id])
@notification.destroy
redirect_to :back
end
下一件要做的事情是设置删除评论时删除通知的方法:
def destroy
@comment = Comment.find(params[:id])
@notification = Notification.where(:comment_id => @comment.id)
if @notification.nil?
@notification.destroy
end
@comment.destroy
redirect_to :back
end
最后要做的是创建一些视图。你可以随心所欲地做什么