2017-02-23 3 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), 

として、コンソール上でそれを実行したときに正しく実行されなかったが、指定された予定のtime.Whereは私が間違っているつもりでは動作しませんか?私はこれを達成することができますか?初心者がレールに乗るので、助けてください。

+0

update_attributeの後にモデルを保存する必要はありません。 –

+0

@AleksanderLopez - ありがとうございました。あなたは主な問題を私に助けてくれますか? –

答えて

0

あなたがワーカープロセスを開始していないと思います。 http://edgeguides.rubyonrails.org/active_job_basics.htmlで説明されているように、さまざまなキューイングバックエンドを設定できます。

あなたがSidekiqを使用したい場合は、sidekiqの宝石を追加

gem '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 

としてsidekiqを設定

をインストールするには、実行 'バンドル' あなたが持っている必要がありますあなたのレールサーバーを横切っているサイドキック

$ bundle exec sidekiq 
+0

実際、私はresque_schedulerを私のサーバの外に置いています –

+0

次に、resqueログを投稿できますか? –

+0

私はサイドキックの宝石を使って試してみました。しかし、そこには何も変わらないようです。 –

関連する問題