我有一个 Rails 应用程序,其中将订单分配给供应商,供应商必须在接下来的 15 分钟内接受订单(出于测试目的,我将其保持在两分钟内)。一旦将订单分配给供应商,状态订单和供应商的订单分配表中的属性更新为已分配。现在供应商必须接受或拒绝订单,根据该订单状态分别更新为接受和拒绝。如果供应商在分配后的 15 分钟内未接受/拒绝订单,则订单分配表中的状态将自动更新为已拒绝。以下是片段
订单分配模型:
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
自动拒绝作业
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的新手,所以请帮忙。