注文がベンダーに割り当てられ、ベンダーが次の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は私が間違っているつもりでは動作しませんか?私はこれを達成することができますか?初心者がレールに乗るので、助けてください。
update_attributeの後にモデルを保存する必要はありません。 –
@AleksanderLopez - ありがとうございました。あなたは主な問題を私に助けてくれますか? –