2010-10-30 35 views
0

好的,这里是我在StackOverflow上问过的最棘手的问题。Rails - News Feed

我的Web应用程序允许创建文档。这个文件自动保存让我们说几秒钟。

同时,我想要一个新闻提要,让用户知道朋友在做什么。所以我创建了一个观察者模型,after_create创建一个news_feed类型的项目。

问题是这个观察者,现在将创建一个news_feed永远保存这是一个巨大的firehose。

所以我想这样做,这个模型的news_feed只注入每个会话或每X分钟。所以我给模型添加了一个last_feeded_at列。

问题是,当我尝试更新观察者中的该字段以标记该字段受到影响时,触发观察者,这会造成一切混乱。

什么是处理这个最好的方法是什么?我愿意接受所有聪明的建议。

感谢

回答

0

我会用这样的逻辑

def find_or_create_feed 
    if session[:news_feed].nil? 
    NewsFeed.new 
    else 
    NewsFeed.find(session[:news_feed]) 
    end 
end 

这样的创建你的新闻源对象,就可以返回相同的NewsFeed对象的整个会话。如果您希望获得幻想并使其到期,请定期扫描news_feeds表以删除特定年龄段的Feed。

+0

@史蒂夫,谢谢,但这住在哪里?你能否提供一些关于用例的更多背景知识?真正兴奋地学习一种更聪明的方式来做我想做的事情。我的代码越来越杂乱!谢谢 – AnApprentice 2010-10-30 05:43:05

+0

嗯,它是你的应用程序,但我认为你有一个控制器,根据你所描述的,处理用户在创建和编辑文档方面的交互。同样,从您的描述中可以看出,您希望在给定会话中首次访问文档时创建新闻Feed。所以,我想我会说在before_filter中将它命中并将结果赋给一个实例变量,以便您的视图可以显示它。或者...有可能我错过了这个功能的意图。 – 2010-10-30 06:14:30

+0

控制器只应在模型上执行1个动作,例如保存文档的更新。文档模型应该执行任何相关的操作。 – Ariejan 2010-10-30 08:39:48

2

我不会为此添加属性文档模型。你可能有这样的事情已经:

class Document 
    has_many :news_feeds, :order => 'created_at DESC' 
end 

在你的回调(在文档模型),只是检查当最后news_feed创建:

after_save :create_news_feed, :if => Proc.new { |doc| doc.news_feeds.first.created_at <= 10.minutes.ago } 

这只会叫create_news_feed如果最后news_feed是至少10分钟前创建。

+0

刚刚注意到您的会话要求。将“attr_accessor:session_id”添加到您的Document模型,并将该值与您创建的每个new_feed记录一起存储。相应地更新':if'语句。 – Ariejan 2010-10-30 08:40:43

+0

OP需要每次会话的新闻提要。为什么不根据会话而不是年龄创建新闻提要? – 2010-10-30 16:06:28

+0

有趣的是,我试图在OBserver中完成所有这些操作,以保持它的独立性。 – AnApprentice 2010-10-30 16:33:08

1

我假设当用户完成编辑时,他们执行最后的保存?定义一个attr_accessor,draft,它在处理request.js ajax保存时作为参数从控制器发送。我并不认为真正需要观察员,只是把它放在模型中。

attr_accessor :draft 
after_save :log_unless_draft 

def log_unless_draft 
    unless draft.eql?(true) 
    log_event.new(... 

顺便说一句,我不这样做,明白为什么after_create甚至引发给出这些都不是new_record?的超越了先保存。

+0

添加一点点颜色。当用户点击New Note时,会创建一个Note,然后用户被重定向到该笔记以开始输入。由于Note Title尚未设置,因此当时我不需要新闻订阅源项目。这就是为什么我只想喂它一次,因为标题是注释无标题.... – AnApprentice 2010-10-30 16:29:15

+0

此外,没有最终的保存,它更像谷歌文档,注释是自动保存到服务器(DEF更新)在计时器和基于用户活动。正是那些淹没Feed并且我想管理的节省。那有意义吗? – AnApprentice 2010-10-30 16:30:06

+0

尽管谷歌文档确实有一个(最终)保存按钮,但对泛滥有意义;我个人认为这将是不好的界面设计。用户预计完成后即可保存,这将是登录到提要的理想时间。 – mark 2010-10-30 17:09:27