Я бы рассмотрел этот подход:
- Прежде чем запрашивать выполнение задания, создайте запись заказа с nil charge_id
- После завершения транзакции Stripeзавершив работу, обновите заказ с помощью возвращенного charge_id
. Для этого вы можете положиться на globalid , который позволяет вашей работе получить доступзаказ напрямую.См. http://guides.rubyonrails.org/active_job_basics.html#globalid для получения информации.
Обновите реализацию своего задания, чтобы теперь обновлять объект после успешного завершения задания:
class StripePaymentJob < ApplicationJob
queue_as :default
def perform(token, idempotent_key, order)
@charge = Stripe::Charge.create({
...
}, { idempotency_key: idempotent_key })
order.update(charge_id: @charge.id, job_id: self.jid)
end
end
Очевидно, что вам потребуется больше ведения журнала и обработки ошибок., поскольку это происходит в фоновом режиме, и вы не будете знать, когда и что не получится.
Ваша рабочая модель теперь будет называть execute_later как
order = Order.create
StripePaymentJob.perform_later(order, token, SecureRandom.uuid)
Дайте мне знать, если это работает,или если мне нужно обновить этот ответ.