2017-02-23 11 views
1

주문이 공급 업체에 지정되어 있고 공급 업체가 다음 15 분 내에 주문을 수락해야하는 레일 앱이 있습니다 (테스트 목적으로 2 분으로 유지). 주문이 공급 업체에 할당되면 주문 및 공급 업체의 주문 할당 테이블에있는 상태 속성이 할당 됨으로 업데이트됩니다. 이제 공급 업체는 상태를 승인 및 거부로 업데이트하는 기준에 따라 주문을 수락하거나 거부해야합니다. 공급 업체가 배정 시점으로부터 15 분 이내에 주문을 수락/거부하지 않으면 주문 할당 테이블에서 거부 된 상태로 자동 업데이트됩니다. 여기에 조각은스케줄러 작업이 Rails 4에서 실행되지 않음

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 (거부 됨)으로 업데이트됩니다. 이것은 auto_rejection_job에서 달성하려고 시도했습니다. 그러나 작업이 enqued로 표시 되더라도 status_id는 업데이트되지 않습니다. 이 작업은 내가 다음 status_id가 업데이트

AutoRejectionJob.set(wait: 2.minutes).**perform_now**(an id), 

로 콘솔을 실행했을 때 제대로 실행 못했지만, 지정된 스케줄 할게 에릭 내가 갈거야 잘못 작동하지 않습니다? 내가 이걸 얻을 수 있니? 레일에 신참, 그래서 제발 도와주세요.

+0

update_attribute 이후에 모델을 저장할 필요가 없습니다. –

+0

@ AleksanderLopez - 고맙습니다. 주요 문제로 나를 도울 수 있습니까? –

답변

0

내 생각 엔 작업자 프로세스를 시작하지 않았다고 생각합니다. http://edgeguides.rubyonrails.org/active_job_basics.html에 설명 된대로 다른 대기열 백엔드를 구성 할 수 있습니다.

당신이 Sidekiq를 사용하려면,

당신이 필요 백엔드

# 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 

는 AS sidekiq를 설정 설치 sidekiq 보석

gem 'sidekiq' 

실행 '번들'추가 레일 서버 옆에있는 사이드 키어

$ bundle exec sidekiq 
+0

사실, 내 서버를 제쳐두고 resque_scheduler를 실행하고 있습니다. –

+0

그러면 resque 로그를 게시 할 수 있습니까? –

+0

나는 sidekiq 보석을 사용하고 당신이 언급 한 같은 단계를 따라 갔다. 아무것도 거기에서 변화하는 것처럼 보이지 않는다. –