如何在 Rails 中创建通知系统?

Posted

技术标签:

【中文标题】如何在 Rails 中创建通知系统?【英文标题】:How to create notification system in rails? 【发布时间】:2013-03-13 13:08:42 【问题描述】:

基本上,我想创建一个类似 Facebook 和 *** 的通知。 具体来说,在 Post-Comments 系统中,当帖子被评论时,所有相关人员(创建帖子和创建 cmets 的人,新评论者除外)都会收到一条通知消息,告知该帖子被评论。 当人们阅读它时,通知会被忽略。

我曾尝试使用 ma​​ilboxer 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 =&gt; topic_id: topic_id).push(topic.user).delete(sender).uniq,发件人是不应通知的新评论者。但我不确定我是否正确使用了推送/删除。请问这个怎么写? 当我使用上面的数组时,我得到undefined method each' for #<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 中创建通知系统?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中创建一个通知时间过去的方法

如何使用注释在 Django ORM 中创建通知日期字段

如何在 iOS8 的通知窗口中创建按钮?

Rails 中的社交网络风格通知系统

如何使用JsonPayload参数在StackDriver过滤器中创建通知

如何在UWP App中创建信息丰富的Toast通知