Как отразить процесс на before_update? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть проект, в котором при попытке обновить какой-либо атрибут запускается длинная и утомительная функция before_update. Эта функция запускает несколько сценариев, и после их успешного завершения атрибут изменяется.

Проблема в том, что мне нужен способ отразить текущее состояние запущенных в данный момент скриптов (для отображения какого-то процесса 2/5 ... 3/5 ...), но я не могу понять решение. Я попытался сохранить последнюю запущенную команду в БД, но поскольку сценарии выполняются в области before_update, фиксация выполняется только после завершения всех сценариев.

Есть ли какое-нибудь элегантное решение этой проблемы?

1 Ответ

0 голосов
/ 14 мая 2018

В общем, вам следует избегать использования дорогостоящего сквозного кода в обратных вызовах.Придет время, когда вы захотите обновить одну из этих записей без запуска этого кода, а затем вы начнете добавлять флаги, чтобы определить, когда должен выполняться этот обратный вызов, и всякие другие неприятности.Кроме того, если запись обновляется во время запроса, дорогой код обратного вызова замедлит весь запрос и, возможно, превысит время ожидания и / или заблокирует доступ других пользователей к вашему приложению.

Способом этого является создание записи вначале (возможно, с флагом / состоянием, которое сообщает остальной части вашего приложения, что обновление еще не «обработано»), то есть соответствующий код в настоящее время находится вВаш обратный вызов еще не запущен).Затем вы поставите фоновую работу, которая выполняет все, что есть в вашем обратном вызове.Если вы используете Sidekiq, вы можете использовать гем sidekiq-status для обновления статуса задания во время его выполнения.

Затем вы добавите контроллер / действие, которое проверяет работу задания.status и возвращает его в формате JSON, а некоторые JS проверяют это действие каждые несколько секунд, чтобы проверить состояние задания и соответствующим образом обновить интерфейс.

Даже если вы не хотите обновлять своих пользователей о статусе задания, фоновое задание, вероятно, все еще будет здесь, особенно если этот код очень дорогой или включает сторонние вызовы API,Если нет, то, скорее всего, он принадлежит контроллеру, и вы можете запустить все это в транзакции.Но если вам нужно сообщить своим пользователям о статусе этой работы, вам следует воспользоваться фоновой работой.

...