В приложении Rails
у меня есть project
с, которые имеют много task
с. task
может иметь predecessor
, который необходимо завершить до запуска задачи.
Я использую sidekiq
для создания задач.
class ScheduleProjectJob < ApplicationJob
queue_as :default
def perform(project)
tasks = Array(project.tasks)
while !tasks.empty? do
task = tasks.shift
if task.without_predecessor? || task.predecessor_scheduled?
ScheduleTaskJob.perform_later(task)
else
tasks << task
end
end
end
I l oop через task
s и запланировать задачу, если у нее нет предшественника или, если она есть, когда предшествующий уже был запланирован.
Чтобы проверить, было ли запланировано предшественника, я проверьте в базе данных, является ли состояние предшественника scheduled
(задачи создаются с состоянием created
и обновляются до scheduled
в конце ScheduleTaskJob
.
Проверка выполняется следующим образом
Task.joins(:task_template).
where(%q(task_templates.dep_id = :dep AND
task_templates.tag = :tag AND
tasks.state = :state),
specification_id: task_template.dep_id,
tag: task_template.runs_after_tag,
state: 'scheduled').
count > 0
Приведенный выше запрос работает нормально, когда я вручную настраиваю БД и запускаю ее, однако, когда она запускается внутри ScheduleProjectJob
, состояние предшествующей задачи всегда отображается как created
, даже если я могу см. в БД значение в записи было обновлено до scheduled
.
Я что-то здесь упускаю?
end