Ruby on rails 在Rails中实现通知

Ruby on rails 在Rails中实现通知,ruby-on-rails,facebook,twitter,notifications,observer-pattern,Ruby On Rails,Facebook,Twitter,Notifications,Observer Pattern,在我的应用程序中,当用户在评论或帖子中被提及时,我想通知用户。 用户句柄是@user\u name,类似于Facebook 用于提及的数据库表如下所示: Mention mentioned_by: user_id (foreign key) user_mentioned: user_id (foreign key) comment_id: (foreign key) post_id: (foreign key) 但是我想不出一个实现它的方法。Facebook/Twitter是如

在我的应用程序中,当用户在评论或帖子中被提及时,我想通知用户。
用户句柄是
@user\u name
,类似于Facebook
用于提及的数据库表如下所示:

Mention
  mentioned_by: user_id (foreign key)
  user_mentioned: user_id (foreign key)
  comment_id: (foreign key)
  post_id: (foreign key)
但是我想不出一个实现它的方法。Facebook/Twitter是如何做到的

我决定使用的是
ActiveRecord回调/Observer设计模式
,每当新的评论/帖子保存到数据库中时,我都可以浏览帖子/评论的内容,查找任何提及的内容,然后根据需要执行通知

我觉得有些东西不见了,但我做得不对。

这是最好的方法吗?

您可以在保存记录时使用ActiveRecord回调(如保存前、保存后或创建前、创建后),查看评论内容,查找并创建所有提及模型,并将其保存到db。

我自己实际上对这个问题的具体答案感兴趣。我不知道Facebook和Twitter是如何做到这一点的,但我从一般的搜索中知道,gem作为标签可以完成这项工作。退房

此外,关于stackoverflow的这个问题也可能为您提供一些信息:


祝你好运。我鼓励你们试着更多地关注这个问题,并得到比我所说的更可靠的答案

Tumblr使用Redis排队系统(如Resque)来处理卷


执行回调(如您所述)并将其交给Resque。(有一个)

没有单一的推荐方法。在uber级别,您可能希望查看“”、轮询和WebSockets[HTML5],然后选择正确的组合。在rails中有两个很好的实现来管理推送通知。轨道、神像、PusherApp、Faye等。你必须深入挖掘,找出他们中的哪一个使用web套接字,然后回到flash选项来处理完全支持

Faye也提供了Node.js配置,但我不确定其他配置

这些步骤暂定如下所示:

  • 保存内容-将其排入解析器队列

  • 解析内容以找出相关用户-使用Nokogiri或同等工具

  • Comet/Poll将其作为一个单独的过程发送给当前_会话中的相关用户,如果您使用类似Twitter的方法

  • //用Post记录做其他事情

  • 将通知推送到相关用户,并在他们稍后联机时销毁()

    希望这能给我们一些指导


  • Facebook和Twitter不是中等规模的Rails应用程序。他们是公司。运行它们的技术是分布式的,大部分是定制的,尤其是在Facebook的情况下

    你似乎要抓住的部分是他们如何以一种高效且可扩展的方式决定通知谁。这就是狗屎变成现实的地方。你可以在每一个平台上找到很多关于架构的信息,当然有很多很好的东西可以帮助你思考这些事情,但最终这些都不会是你在构建的任何应用程序中实现的东西

    在Quora还有很多有趣的细节


    不幸的是,这些都不能让你更接近你的目标。我认为对您来说,最现实的做法是首先简单地绑定一个服务,比如向客户端发送消息而不必担心,使用添加通知到工作人员实际向Pusher发送这些通知的服务。这是一天或更少的工作,应该可以扩展到每天至少10k通知。一旦你开始出现性能问题,抛弃观察者和推动者,换一种像Goliath这样的东西,它可以在本地处理这两项工作

    总之,要尽可能地了解大型和有经验的系统,这些系统已经过测试,但主要是为了了解它们遇到了什么问题以及它们是如何解决的。这些方法在大公司中甚至都不一样,而且每种实现都会有所不同


    希望这能帮你找到一个好的方向。:)

    我知道这个问题已经过时了,但我最近在rubygems.org上发布了一个“提及系统”gem,它允许在被提及对象和提及者之间创建提及,它还允许你在facebook/twitter styler中检测提及,比如@username1和#hashtag,以便创建提及

    gem托管在github:

    假设你有一篇帖子可以以@username的形式提及用户

    你有课吗

    class Post < ActiveRecord::Base
      act_as_mentioner
    end
    

    如果你的帖子内容中有@user1、@user2和@user3,提及处理者将解析user1、user2、user3,找到用户名为[user1、user2、user3]的用户,然后在数据库中创建提及,在每次提及之后,它将运行after回调,在示例中,该回调将发送一封电子邮件,通知post和user之间的提及。

    我在上面的问题中也提到过。我想问的是,这是不是最好的方法。Facebook/Twitter是如何做到这一点的。我鼓励你在这个问题上添加“Facebook”和“Twitter”标签,这样其他人可能会更容易发现它。还有,也许就这件事开始悬赏?我相信很多人都对这个问题的答案感兴趣。@daze:谢谢你的建议。添加正确的标记确实有帮助。:)谢谢你的回答。但实际上,我更感兴趣的是知道最好的方法,而不是优化队列解决方案。不过,非常感谢你的建议。我会记住的。
    class User < ActiveRecord::Base
      act_as_mentionee
    end
    
    class PostMentionProcessor < MentionSystem::MentionProcessor
      def extract_mentioner_content(post)
        return post.content
      end
    
      def find_mentionees_by_handles(*handles)
        User.where(username: handles)
      end
    end
    
    def create
      @post = Post.new(params[:post])
      if @post.save
        m = PostMentionProcessor.new
        m.add_after_callback Proc.new { |post, user| UserMailer.notify_mention(post, user) }
        m.process_mentions(post)
      end
    
      respond_with @post
    end