【问题标题】:Resque caching active record callResque 缓存活动记录调用
【发布时间】:2012-04-17 05:52:43
【问题描述】:

我有一个简单的 resque 作业,它接受模型 ID,获取它,然后调用获取的项目的方法。

class CupcakeWorker
  @queue = :cupcake_queue
  def self.perform(cupcake_id)
    @cupcake = Cupcake.find(cupcake_id)
    @cupcake.bake
  end
end

我使用 'enqueue' 方法从控制器操作中对其进行排队

def bake
  Resque.enqueue(CupcakeWorker, params[:cupcake_id])
  render :json => 'Baking...'
end

作业排队并正确执行。但是,如果我修改数据库中的记录数据并再次将作业排队,则不会使用新值执行操作。

如果我重新启动 resque 工作进程,我只能让它获取新值。 resque 是否正在缓存对象?有没有办法确保每次调用工人时它都从数据库中重新获取?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord redis resque


    【解决方案1】:

    这个答案有点粗略,但可以工作。在进行任何处理之前,您可以在 ActiveRecord 模型上调用 reload。这会强制 ActiveRecord 更新数据。

    工人看起来像这样:

    class CupcakeWorker
      @queue = :cupcake_queue
      def self.perform(cupcake_id)
        @cupcake = Cupcake.find(cupcake_id).reload
        @cupcake.bake
      end
    end
    

    不过,恐怕我不知道为什么 Resque 会这样做。试试Sidekiq,看看能不能得到更好的结果。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2020-10-07
      • 2012-07-09
      • 2013-05-27
      • 1970-01-01
      相关资源
      最近更新 更多