1

我有一个 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的新手,所以请帮忙。

4

1 回答 1

0

My guess is that you haven't started the worker process. As described in http://edgeguides.rubyonrails.org/active_job_basics.html, you can configure a bunch of different queuing backends.

If you want to use Sidekiq, add the sidekiq gem

gem 'sidekiq'

run 'bundle' to install

Set up sidekiq as the backend

# config/application.rb
module YourApp
  class Application < Rails::Application
    # Be sure to have the adapter's gem in your Gemfile
    # and follow the adapter's specific installation
    # and deployment instructions.
    config.active_job.queue_adapter = :sidekiq
  end
end

The you need to have sidekiq running aside your rails server

$ bundle exec sidekiq
于 2017-02-23T09:59:12.877 回答