我已经建立了一个帖子和评论系统,现在我会添加一个通知系统,以便在每次有人撰写评论时提醒对话中的每个用户。
我的问题是,在构建此系统的数据库方面,哪种方法最好? 我想到了一个包含以下字段的通知表:
id_notification | sent_by | id_user_receiver | id_post
1 2 3 10
在此示例中,id为2的用户已向id为10的帖子写了评论,而id为3的用户收到了通知。但是,如果对话涉及100或1000个用户,则每次用户在对话上写字时,我将在数据库中结束100或1000条记录。我认为不是正确的方法。什么是更好的解决方案?
答案 0 :(得分:3)
我认为这是正确的方法,如果用户阅读通知,您只需删除该行,因为将来不再需要它。除此之外,1000条记录都不算什么。您可以轻松地在表中包含数百万条记录,只需确保您的索引正确。
答案 1 :(得分:0)
第一步是为通知
创建一个新模型和控制器 $ 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
最后要做的是创建一些视图。你可以随心所欲地做什么