2016-10-27 9 views
0

В рельсах мне часто приходилось посылать электронное письмо кому-то о чем-то, что было удалено. Проблема заключается в том, что при написании асинхронной электронной почты объект был удален до создания электронной почты.Отправить async письмо об уничтоженных объектах

Обычно я добавляю целые числа и строки как параметры, как предлагает sidekiq. Я думал о выполнении этого:

mail = MyMailer.some_mail(recipient_id, deleted_object_id) 
mail.delay.deliver 

Но это не рекомендуется либо: избежать затягивания методы экземпляров


Я также считается 2 другие варианты, но я их не люблю вообще.

  1. Используйте act_as_paranoid, установив поле delete_at в записи вместо удаления из db.
  2. Рендер тело электронной почты, сохранить в БД и отправить позже

Все предложения на Проппер способ решить эту проблему?

+0

по какой причине вам необходимо отправить электронное письмо? Если вам нужно подтвердить и это вариант, отмените удаление, возможно, параноик является хорошим вариантом. Но если нужно только уведомить, я думаю, что вариант состоит в том, чтобы сохранить только текст (тело электронной почты или некоторые подобные этому). – inye

+0

Вы можете использовать свой первый вариант, и вы можете назначить задание на работу каждые три дня или каждую неделю (или что угодно, want), и эта работа будет искать эти записи с 'deleted_at <= 1.week.ago' и удалять эти старые записи. – fanta

ответ

1

При удалении объекта и отправке сообщения такое сообщение тесно связано, вы можете создать работу sidekiq, которая выполняет обе функции. Поэтому вам нужно только отправить идентификатор на задание. Задание sidekiq удаляет ваш объект и отправляет его синхронно по электронной почте в задание. По вашему запросу почта по-прежнему отправляет асинхронный.

+0

Мне нравится идея. Единственное, что мне кажется неудачным, это то, что пользователь, который вызвал удаление, по-прежнему будет видеть объект, потому что его работа, вероятно, еще не выполнена. Возможно, опция «deleted_at» - это путь, который нужно сделать. –