【发布时间】:2017-02-23 07:03:20
【问题描述】:
我有一个 Rails 应用程序,其中将订单分配给供应商,供应商必须在接下来的 15 分钟内接受订单(出于测试目的,我将其保持在两分钟内)。一旦将订单分配给供应商,订单和供应商的订单分配表中的状态属性更新为已分配。现在供应商必须接受或拒绝订单,根据该订单状态分别更新为接受和拒绝。如果供应商在分配后的 15 分钟内未接受/拒绝订单,则订单分配表中的状态将自动更新为已拒绝。这是sn-ps
OrderAssignment 模型:
class Estamps::OrderAssignment < ActiveRecord::Base
belongs_to :vendor, class_name: 'Estamps::Vendor'
belongs_to :order, class_name: 'Estamps::Order'
belongs_to :status, class_name: 'Estamps::OrderAssignments::Status'
after_save :enqueue_check_status
def enqueue_check_status
AutoRejectionJob.set(wait: 2.minutes).perform_later(self.id)
if self.status_id == 3
OnRejectionJob.perform_later(self.id)
end
end
end
订购型号:
has_many :order_assignments
belongs_to :vendor
供应商型号:
has_many :order_assignments
has_many :orders
Auto_rejection_job
class AutoRejectionJob < ActiveJob::Base
queue_as :auto_rejection
def perform(order_assignment_id)
order_assignment = Estamps::OrderAssignment.find(order_assignment_id)
if order_assignment
if order_assignment.status_id == 1
order_assignment.update_attribute('status_id', '3')
order_assignment.save!
end
end
end
end
OrderAssignment 架构:
create_table "estamps_order_assignments", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "vendor_id"
t.integer "order_id"
t.integer "status_id"
end
这里的 status_id 来自另一个包含各种状态的表。
现在在创建订单分配记录后,初始分配状态(status_id: 1),如果供应商不更新状态,则 status_id 自动更新为 status_id:3(rejected)。我尝试在 auto_rejection_job 中实现这一点。但是,尽管作业显示为已入队,但 status_id 并未更新。当我在控制台上以
身份运行该作业时,该作业确实运行正常AutoRejectionJob.set(wait: 2.minutes).**perform_now**(an id),
然后 status_id 已更新,但在指定的预定时间不起作用。我哪里出错了?我怎样才能做到这一点? Rails 新手,请帮忙。
【问题讨论】:
-
你不必在update_attribute之后保存模型。
-
@AleksanderLopez - 我会编辑,谢谢。你能帮我解决主要问题吗?
标签: ruby-on-rails ruby jobs resque-scheduler