好吧,这是我曾经在StackOverflow上提出的最棘手的问题。
我的Web应用程序允许创建文档。这个文件会自动保存,可以说几秒钟。
与此同时,我想要一个新闻提要,让用户知道朋友们在做什么。所以我创建了一个观察者模型,其中after_create创建了一个news_feed类型的项目。
问题是这个观察者现在将创建一个news_feed on ever save,这是一个巨大的消防。
所以我想这样做,所以这个模型的news_feed只注入每个会话或每X分钟。所以我在模型中添加了last_feeded_at列。
问题是,当我尝试更新观察者中的那个字段以标记它被填充时,会触发观察者,这会使一切变得混乱。
处理此问题的最佳方法是什么?我对所有聪明的建议持开放态度。
由于
答案 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。