У меня есть страница с длинным списком товаров. У каждого есть флажок рядом с ним. Есть функция проверки всех jQuery, но когда я отправляю их все сразу, запрос прерывается, потому что он выполняет несколько запросов и вставляет несколько записей в базу данных MySQL для каждого элемента. Если бы не время ожидания, это заняло бы около 20 минут. Вместо этого я просто отправляю как 30 за раз.
Я хочу иметь возможность просто проверить все и отправить, а затем просто продолжать выполнять другую работу. Мой коллега (1) сказал, что я должен написать грабли. Я сделал это, но в итоге я продублировал код, и я предпочитаю пользовательский интерфейс, потому что, если я хочу отменить проверку? Задание с граблями просто отправляет их всех.
Другой сотрудник (2) рекомендовал использовать вилку. Он сказал, что это породит новый процесс, который будет запущен на сервере, но позволит серверу ответить до того, как это будет сделано. Затем, поскольку элемент исчез после отправки, я мог бы просто обновить страницу, чтобы проверить, все ли выполнено.
Я попробовал это на своем локальном компьютере, однако, все еще кажется, что Rails ожидает завершения процесса, прежде чем он ответит на запрос POST, отправленный HTML-формой. Код, который я использовал, выглядит следующим образом:
def bulk_apply
pid = fork do
params[:ids].each do |id|
Item.find(id).apply # takes a LONG time, esp. x 100
end
end
Process.detach(pid) # reap child process automatically; don't leave running
flash[:notice] = "Applying... Please wait... Then, refresh page. Only submit once. PID: #{pid}"
redirect_to :back
end
Coworker 1 сказал, что обычно вы не хотите форкать Rails, потому что форк создает дочерний процесс, который по сути является копией процесса Rails. Он сказал, что если вы хотите сделать это через веб-интерфейс, используйте BackgroundJob (Bj) (потому что мы уже используем это в нашем приложении Rails). Итак, я сейчас изучаю BackgroundJob, но что вы порекомендуете?