Будет ли действительный экземпляр activerecord передан в качестве параметра почтовой программе, которая будет отправлена ​​позже? - PullRequest
0 голосов
/ 15 октября 2019

Я передаю в качестве параметра экземпляр ActiveRecord в Mailer через:

SomeMailer.with(my_instance: someActiveRecordInstance).welcome_mail.send_later

А затем, позже , когда письмо будет отправлено, я делаю некоторые вещи внутри Mailer, например:

my_instance = params[:my_instance]
name = my_instance.name
lastname = my_intance.lastname

И вот мой вопрос: станет ли ActiveRecord допустимым после завершения запроса, и почтовик будет выполнен позже (может быть, другой поток, я думаю)?

Iне могу представить, что будет. Но все же я думаю, что, может быть, мне лучше передать id экземпляра, а затем извлечь его снова, когда мне понадобится его внутри почтовой программы, или просто передать экземпляр объекта будет нормально?

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Это не очень хорошая практика. Учитывая,

  1. Экземпляр мог быть обновлен к тому времени, когда к нему обращались в почтовой программе.
  2. Если этот сериализованный экземпляр модели ActiveRecord имеет столбцы большой / длины (возможно, столбцы TEXT или json)), он может сломаться из-за максимального размера задания.

Вторые точки зависят от адаптера, используемого для ActiveJob. Например, SQS имеет ограничение размера сообщения 256 КБ

1 голос
/ 15 октября 2019

Вы можете передать его, но, как вы упомянули, вы не знаете, что происходит во время отправки почты, возможно, эта запись уже удалена, и это вызовет ошибки. Лучшая практика с delayed job или worker - это просто передача идентификатора, тогда в задании мы можем найти запись во время ее выполнения

...