在Rails中实现通知
在我的应用程序中,我想在评论或post中提及他/她时通知用户。
用户句柄是@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
,每当新的评论/post保存到数据库时,我都可以浏览post/评论的内容,并留意任何提及,然后执行通知按要求。
我觉得有一些缺失的部分,我没有把它弄好。
这是最好的方式吗?
Facebook和Twitter不是中型Rails应用程序。 他们是公司。 运行它们的技术是分布式的,主要是定制的,特别是在Facebook的情况下。
您似乎正在抓住的部分是他们如何确定以高效和可扩展的方式通知的人 。 这就是狗屎变得真实的地方。 你可以找到很多关于它们背后的架构的信息,当然有许多很棒的东西可以帮助你思考这些东西,但最终它们都不会成为你实现的任何应用程序。重建。
http://www.quora.com/What-is-Facebooks-architecture
Facebook架构
http://www.infoq.com/news/2009/06/Twitter-Architecture
http://engineering.twitter.com/2010/10/twitters-new-search-architecture.html
Quora的细节更加丰富多彩。
不幸的是,这一切都无法让您更接近目标。 我认为最开始的事情就是简单地将Pusher这样的服务绑定到客户端而不用担心它,使用ActiveRecord Observer将通知添加到工作人员实际发送的后台队列中那些通知Pusher。 这是一天或更少的工作,它应该可以很好地扩展到每天至少10k通知。 一旦你开始遇到性能问题,抛弃Observer和Pusher就像Goliath这样可以在本地处理这两个工作的东西。
最重要的是,了解大型和经验丰富的系统可以了解的内容,但主要是了解他们遇到了什么问题以及他们如何解决这些问题 。 这些方法在大家伙之间并不相同,而且每种实施方式都会有所不同。
希望这有助于指明你的方向。 🙂
您可以在保存记录时使用ActiveRecord回调(如before_save,after_save或before_create,after_create)来浏览评论内容,查找并创建所有提及模型并将其保存到db。
我实际上对自己的具体答案感兴趣。 我不知道Facebook和Twitter是如何做到这一点的,但我从一般搜索中知道,gem可以作为标记可以完成工作。 查看https://github.com/mbleigh/acts-as-taggable-on 。
此外,stackoverflow上的这个问题也可能为您提供一些信息: 在rails上实现类似twitter的hashtag
祝好运。 我鼓励你尝试更多关注这个问题,并得到比我所说的更加坚实的答案。 :]
Tumblr使用Redis排队系统(如Resque)我相信处理音量。
做一个回调(如你所提到的)并将其交给Resque。 ( 最近有关于Resuqe的Railscasts )
没有单一的推荐方法。 在超级级别,您可能需要查看“ Comet编程 ”,轮询和WebSockets [HTML5],然后选择正确的组合。 在rails中管理推送通知有几个很棒的实现。 Orbited,Juggernaut,PusherApp,Faye等你必须深入挖掘出哪些’使用网络套接字并且回退到闪存选项来处理全面支持。
Faye也提供了Node.js配置,但我不确定其他人。
暂时的步骤看起来像:
- 保存内容 – 将其排入解析器
- 解析内容以找出涉及的用户 – 使用Nokogiri或同等的。
- 如果您正在寻找类似于Twitter的方法,请将Comet / Poll将其作为一个单独的流程发送给current_session中的相关用户。
- //使用Post记录做其他事情
-
推送通知给相关用户,并在以后联机时销毁()。
希望能给出一些指导。
我知道这个问题已经过时了,但我最近发布了一个MentionSystem gem给rubygems.org,它允许在提及对象和提及者之间创建提及,它还允许你在@ username1和#hashtag中检测facebook / twitter样式中的提及以便创建提到。
gem托管在github: https : //github.com/pmviva/mention_system
假设您有一个post可以以@username的forms提及用户。
你有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
然后在你的post控制器创建操作你有:
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
如果您的post在其内容中有@ user1,@ user2和@ user3,提及处理器将解析user1,user2,user3,将找到用户名为[user1,user2,user3]的用户,然后在每个用户之后创建数据库中的提及提到它将运行后回调,在该示例中将发送电子邮件通知post和用户之间的提及。
- 使用考拉在Facebook上发布带有标签的照片
- Omniauth-Facebook回调不会在Rails可安装引擎中初始化
- 设计 – 无法在rails视图中显示登录或注销
- 如何在配置/初始化程序中使用YML值
- 修复Rails oauth facebook x-frame-options sameorigin错误
- 如何使用Minitest测试OmniAuth的SessionsController
- Rails facebook app返回422“你想要的改变被拒绝”错误
- 未初始化的常量User :: Authorization | omniauth
- 使用facebook图表,fb_graph或Koala ruby gem比facebooker2好吗?