【问题标题】:Rails move expensive method to taskRails 将昂贵的方法转移到任务中
【发布时间】:2013-09-16 07:04:46
【问题描述】:

我的模型中有这两种方法。一种方法查找单个 CatalogItem facebook like count,另一种方法遍历所有活动 CatalogItems 并使用上述方法找到它们的like count。

浏览所有活跃的 facebook 喜欢需要一段时间……它可能会循环 300-1000 个对象;所以我想把它移到某种 cron,或者你们建议的任何东西。

我在想我应该向 CatalogItem 添加一个名为 cached_fb_count 的列,并调整 self.facebook_likes 以便在该任务运行时写入该列。

这是正确的方法吗?如果该任务每 2 小时运行一次,它会是什么样子?

def self.facebook_likes
  self.active.each_with_index do |i, index|
    _likes = i.facebook_like_count
    i.update_attribute(:cached_likes, _likes)
    # puts "#{index+1}   Likes:  #{_likes}  ###########   ID:  #{i.id}  "
  end
end

def facebook_like_count
  item_like_count = JSON.parse(open("https://api.facebook.com/method/fql.query?query=select%20like_count%20from%20link_stat%20where%20url='https://www.foobar.com/catalog_items/#{self.id}'&format=json").read).first.flatten[1]
  item_like_count = item_like_count + 1 if item_like_count > 0 
end

【问题讨论】:

    标签: ruby-on-rails scheduled-tasks cron-task


    【解决方案1】:

    Delayed_job 是执行异步任务的完美工具。它在一个单独的进程中运行,基于关系数据库(Active Record),因此它将执行上下文保存为一个简单的脚本调用。并具有丰富的功能,包括任务的优先级和scheldue。但如果您的任务假定队列很大,请考虑Resque gem。它使用 Reddis 作为任务存储,处理长队列时速度更快。

    【讨论】:

      【解决方案2】:

      只要很容易设置就可以使用。这是链接:https://github.com/javan/whenever

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2011-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多