Rails - 新闻Feed

时间:2010-10-30 05:09:46

标签: ruby-on-rails ruby-on-rails-3

好吧,这是我曾经在StackOverflow上提出的最棘手的问题。

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

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

问题是这个观察者现在将创建一个news_feed on ever save,这是一个巨大的消防。

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

问题是,当我尝试更新观察者中的那个字段以标记它被填充时,会触发观察者,这会使一切变得混乱。

处理此问题的最佳方法是什么?我对所有聪明的建议持开放态度。

由于

3 个答案:

答案 0 :(得分: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 }

如果最后一次news_feed是在至少10分钟前创建的,则只会调用create_news_feed

答案 1 :(得分: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?超出了第一次保存。

答案 2 :(得分:0)

我使用这种逻辑

创建你的NewsFeed对象
def find_or_create_feed
  if session[:news_feed].nil?
    NewsFeed.new
  else
    NewsFeed.find(session[:news_feed])
  end
end

这样,您可以为整个会话返回相同的NewsFeed对象。如果您希望获得幻想并使其过期,请定期扫描news_feeds表以删除给定年龄的Feed。

相关问题