首页 文章

在Rails中实现通知

提问于
浏览
17

在我的申请中,我想在评论或帖子中提及他/她时通知用户 .
用户句柄为 @user_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 callbacks/ Observer design pattern ,每当新的评论/帖子保存到数据库时,我都可以浏览帖子/评论的内容,并留意任何提及,然后根据需要执行通知 .

我觉得有一些缺失的东西,我没有把它弄好 .
这是最好的方式吗?

6 回答

  • 1

    Tumblr使用Redis排队系统(如Resque)我相信处理音量 .

    做一个回调(如你所提到的)并将其交给Resque . (有一个Railscasts about Resuqe recently

  • 27

    Facebook和Twitter不是中型Rails应用程序 . 他们是公司 . 运行它们的技术是分布式的,主要是定制的,特别是在Facebook的情况下 .

    您似乎正在 grab 的部分是他们如何确定以高性能和可扩展的方式通知的人 . 这就是狗屎变得真实的地方 . 你可以找到很多关于它们背后的架构的信息,当然有许多很棒的东西可以帮助你思考这些东西,但最终它们都不会成为你实现的任何应用程序 . 重建 .

    http://www.quora.com/What-is-Facebooks-architecture

    Facebook Architecture

    http://www.infoq.com/news/2009/06/Twitter-Architecture

    http://engineering.twitter.com/2010/10/twitters-new-search-architecture.html

    Quora的细节更加丰富多彩 .


    不幸的是,这一切都无法让您更接近目标 . 我认为对你来说最真实的事情就是简单地绑定像Pusher这样的服务来向客户发送消息而不用担心它,使用ActiveRecord Observer将通知添加到工作人员实际发送通知的background queue推送 . 这是一天或更少的工作,它应该可以很好地扩展到每天至少10k通知 . 一旦你开始遇到性能问题,抛弃Observer和Pusher就像Goliath这样可以在本地处理这两个工作的东西 .

    最重要的是,了解大型和经验丰富的系统可以了解的内容,但主要是看看他们遇到了什么问题以及他们如何解决这些问题 . 这些方法在大家伙中并不相同,并且每种实现方式都会有所不同 .

    希望这有助于指明你的方向 . :)

  • 2

    您可以在保存记录时使用ActiveRecord回调(如before_save,after_save或before_create,after_create)来浏览评论内容,查找并创建所有提及模型并将其保存到db .

  • 2

    我实际上对自己的具体答案感兴趣 . 我不知道Facebook和Twitter是如何做到这一点的,但我从一般搜索中知道,gem可以作为标记可以完成工作 . 看看https://github.com/mbleigh/acts-as-taggable-on .

    此外,stackoverflow上的这个问题也可能为您提供一些信息:Implementing twitter-like hashtag on rails

    祝好运 . 我鼓励你尝试更多地关注这个问题,并得到比我所说的更加坚实的答案 . :]

  • 2

    没有单一的推荐方法 . 在一个超级级别,你可能想要看看'Comet programming ', Polling and WebSockets [HTML5] and then choose the right combination. There are a couple of great implementations to manage push notifications in rails. Orbited, Juggernaut, PusherApp, Faye etc. You'我必须深入挖掘哪些'他们使用网络套接字&并且回退到闪存选项来处理完全支持 .

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

    暂时的步骤看起来像:

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

    • 解析内容以找出涉及的用户 - 使用Nokogiri或同等产品 .

    • Comet /将其作为一个单独的过程投票给current_session中的相关用户,如果你正在看Twitter这样的方法 .

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

    • 向相关用户推送通知,并在以后联机时推送destroy() .

    希望能给出一些指导 .

  • 1

    我知道这个问题已经过时了,但我最近发布了一个MentionSystem gem给rubygems.org,它允许在提及对象和提及者之间创建提及,它还允许你在@ username1和#hashtag中检测facebook / twitter样式中的提及以便创建提到 .

    宝石托管在github:https://github.com/pmviva/mention_system

    假设您有一个可以以@username的形式提及用户的帖子 .

    你有 class

    class Post < ActiveRecord::Base
      act_as_mentioner
    end
    

    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
    

    如果您的帖子在其内容中有@ user1,@ user2和@ user3,提及处理器将解析user1,user2,user3,将找到用户名为[user1,user2,user3]的用户,然后在每个用户之后创建数据库中的提及提到它将运行后回调,在该示例中将发送电子邮件通知帖子和用户之间的提及 .

相关问题