【问题标题】:run hook if condition with delayed_job如果条件延迟,则运行钩子
【发布时间】:2013-01-15 02:05:34
【问题描述】:

我的控制器上有这个工作:

def action1
 #code here
  order = Order.find(params[:id])
  Delayed::Job.enqueue(ExpiredMessage.new(order), 2, 2.days.from_now)
 #code here
end

我在myapp/app/jobs 中有一个名为expired_message.rb 的文件中的自定义作业,其内容如下:

class ExpiredMessage < Struct.new(:order)
 def perform
  #code to run here for example order.save
   order.any_method
 end
end

我只想执行perform method 中的代码if order.status == "PA"

如何在保存订单之前运行挂钩以检查我的自定义作业中的if order.status == "PA"

否则,如果 order.status != "PA" 我想在该作业执行之前删除该作业。

非常感谢!

【问题讨论】:

  • 有什么原因不能在加入队列之前检查它吗?
  • 是的,原因是订单状态可以在2.minutes或2.days...等时间内更改为其他状态
  • 其他进程如何访问这个订单对象来修改它?还是您的意思是在数据库中更改?如果是,那么“保存”它的目的是什么——它已经存在了!
  • Order.save 是代码示例。如果导致混淆,我已经更改了代码。创建新订单后,我想在 2 天后运行 order.any_method,但只在我的数据库上运行 if order.status == "PA"。如果创建订单后order.status"PA" 不同。我不想要order.any_method。不知道我解释的对不对
  • 那么一个简单的if 条件和数据库重新加载就足够了 - 请参阅下面的答案。

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 delayed-job


【解决方案1】:

如果您想从数据库中检查对象的状态,请在其上调用reload。否则,只需像检查任何其他对象一样检查它:

def perform
  order.any_method if order.reload.status == "PA"
end

【讨论】:

  • 非常感谢。你的回答是正确的。问题在于重新加载数据库:D。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 2011-01-01
  • 2022-08-20
  • 1970-01-01
  • 2018-10-17
  • 2014-11-06
  • 1970-01-01
相关资源
最近更新 更多