2013-03-04 2 views
0

В настоящее время я вызываю delayed_job (gem delayed_job_mongoid), чтобы отправить подтверждение по электронной почте. Однако, похоже, он не использует последние данные, которые я передаю, и вместо этого использует кешированную версию. Смотрите ниже:Задержка кэширования ActionMailer Delayed_job?

Мой контроллер:

... 
_user.calculate_orders 
_user.save 
_user.reload 
Mailer.delay.order_reported(_user) 
... 

почтоотправителя

class Mailer < Devise::Mailer 
    def order_reported(to_user) 
    @to_user = to_user 
    email_with_name = "#{@to_user.name} <#{@to_user.email}>" 
    mail(:to => email_with_name, :subject => "Test email") 
    end 
end 

Например, если атрибут _user.total_orders = 3 обновляется до 5 и сохранены. Это правильно отражено в базе данных, отсроченное задание DB запись содержит обновленную информацию 5, но когда электронная почта отправляется, он использует кэшированные данные о 3.

Я также попытался вызвать метод с помощью рельсов консоли:

Это работает и использует параметр, который передается и обновленной информации

Mailer.order_reported(u).deliver 

Это не работает и использует кэшированные данные

Mailer.delay.order_reported(u) 

ответ

0

У меня был очень похожий про недавно появилось сообщение Sidekiq, связанное с передачей в сериализованной версии объекта User вместо простого ID.

Я бы реорганизовал немного, чтобы передавать простые объекты в качестве параметров в методе с задержкой. Таким образом, вы могли бы сделать это вместо:

Mailer.delay.order_reported(_user.id) 

, а затем обновить метод следующим образом:

class Mailer < Devise::Mailer 
    def order_reported(to_user_id) 
    @to_user = User.find(to_user_id) 
    email_with_name = "#{@to_user.name} <#{@to_user.email}>" 
    mail(:to => email_with_name, :subject => "Test email") 
    end 
end 

Это будет гарантировать, что Вы всегда получите свежий пользовательский объект, когда ваша почтовая программа на самом деле доставлено.

+0

Привет, Тим, спасибо за предложение. Я попробовал это, но кажется, что delayed_job все еще кэширует старый объект. Кажется, это перезагрузится, если я перезапущу ди-джея. Затем я попробовал @to_user = User.find (to_user_id) .reload и, похоже, работает, но разве это неэффективно? – Dean

+0

Нет, так как вам нужно всегда загружать объект из базы данных. Это завершает нас как простой запрос SELECT, который легко кэшируется базой данных. –

+0

Спасибо. Странно, что .find() не работал, но .find(). Reload делает, хотя это другой рабочий. – Dean

Смежные вопросы