如何在 Rails 中创建通知系统?
Posted
技术标签:
【中文标题】如何在 Rails 中创建通知系统?【英文标题】:How to create notification system in rails? 【发布时间】:2013-03-13 13:08:42 【问题描述】:基本上,我想创建一个类似 Facebook 和 *** 的通知。 具体来说,在 Post-Comments 系统中,当帖子被评论时,所有相关人员(创建帖子和创建 cmets 的人,新评论者除外)都会收到一条通知消息,告知该帖子被评论。 当人们阅读它时,通知会被忽略。
我曾尝试使用 mailboxer gem 来实现它,但遗憾的是没有使用其相关方法的示例,包括 social_stream 本身。
还有其他方法可以创建通知系统吗?
当我尝试从头开始创建它时,我遇到了几个问题:
Model Notification
topic_id: integer
user_id: integer
checked: boolean #so we can tell whether the notification is read or not
-
通知被用户阅读后关闭
我认为我们只需在用户访问通知索引后将每个通知消息的“已检查”属性设置为 true。(在 NotificationsController 中)
def index
@notifications=current_user.notication.all
@notification.each do |notification|
notification.checked = true
end
@notification.save!
end
2.选择要通知的用户(并排除发表新评论的用户)
我只是不知道写查询....
3.创建通知
我觉得应该是这样的
#in CommentController
def create
#after creating comments, creat notifications
@users.each do |user|
Notification.create(topic_id:@topic, user_id: user.id)
end
end
但我觉得这真的很丑
以上3个问题无需回答,通知系统的任何简单解决方案都是可取的,谢谢....
【问题讨论】:
这个答案可能会提供一些线索:***.com/a/7049110/1096545 - 它展示了如何为此目的使用 ActiveRecord 观察者。 【参考方案1】:我认为你走在正确的道路上。
更好的通知#index
def index
@notifications = current_user.notications
@notifications.update_all checked: true
end
通知此用户
User.uniq.joins(:comments).where(comments: id: @comment.post.comment_ids).reject |user| user == current_user
参与@comment 帖子 cmets 的唯一用户,拒绝(从结果中删除)current_user。
-
João Daniel 指出的观察者,它优于 after_create。这个“Rails 最佳实践”很好地描述了它:http://rails-bestpractices.com/posts/2010/07/24/use-observer
【讨论】:
非常感谢您!但是.....如何将 post.user.id 添加到 User.uniq.joins... 查询中?在该查询中,只有评论者会收到通知。 忽略我之前的评论(已删除),因为我们已经在内存中拥有 post 对象,您可以这样做(User.uniq.joins(:comments).where(comments: id: @comment.post.comment_ids) | [post.user]).reject |user| user == current_user
。这意味着:如果 post.user 在拒绝 current_user 之前不存在,则将其添加到数组中
我遇到了另一个问题.... User.uniq.joins(:cmets)....和 User.joins(:cmets)....uniq 有什么区别?也就是说,将 'uniq' 放在前面或后面。
我正在尝试类似users=User.joins(:replies).where(:replies => topic_id: topic_id).push(topic.user).delete(sender).uniq
,发件人是不应通知的新评论者。但我不确定我是否正确使用了推送/删除。请问这个怎么写?
当我使用上面的数组时,我得到undefined method
each' for #<0x4c772a0>
0x4c772a0>【参考方案2】:
有一个神奇的宝石叫做公共活动,你可以随意定制它 这是 railscast http://railscasts.com/episodes/406-public-activity 中关于它的截屏视频 希望对你有帮助。
更新
在我的 rails 应用程序中,我制作了一个与您类似的通知系统,用于向所有用户发送通知 但在索引操作中,您可以使用
current_user.notifications.update_all(:checked=>true)
并且还可以使用 unique_by 方法只向用户发送一次通知,而不是多次有人对帖子发表评论
@comments =@commentable.comments.uniq_by |a| a[:user_id]
那么你可以只向以前的 cmets 的用户发送通知
@comments.each do |comment|
comment.user.notifications.create!(....
end
希望对你有帮助
【讨论】:
我已经看过这一集,但我认为这是用于状态提要,不适合通知系统?以上是关于如何在 Rails 中创建通知系统?的主要内容,如果未能解决你的问题,请参考以下文章