Ruby on rails 处理作业时是否执行延迟的Sidekiq Mailer方法?
我有一个典型的ActionMailer,它有一个指定电子邮件传递的方法Ruby on rails 处理作业时是否执行延迟的Sidekiq Mailer方法?,ruby-on-rails,sidekiq,Ruby On Rails,Sidekiq,我有一个典型的ActionMailer,它有一个指定电子邮件传递的方法 def some_email(user_id) @user = User.find(user_id) if @user.eligible_for_email? mail(to: @user.email, from: "me@me.com", subject: "The Subject") @user.email_sent = Date.today @user.save end end 我想
def some_email(user_id)
@user = User.find(user_id)
if @user.eligible_for_email?
mail(to: @user.email, from: "me@me.com", subject: "The Subject")
@user.email_sent = Date.today
@user.save
end
end
我想使用Sidekiq延迟此文件的发送,因此我使用:
Mailer.delay_for(2.days).some_email(user.id)
符合条件的\u for \u电子邮件方法:
def eligible_for_email?
!unsubscribed? && email_sent.nil?
end
同时,用户可能已经取消订阅,这就是为什么在用户模型中有一个名为qualified\u for\u email?
的方法,我可以使用它有条件地发送电子邮件-但显然,这个条件需要在发送电子邮件之前测试,而不是在安排作业时测试
所以问题是,当我使用Sidekiq来处理这个问题时,当任务完成时,条件逻辑似乎没有运行
Sidekiq是否在运行时执行
some_email
方法,然后将生成的电子邮件排队两天后发送,从而否定我的条件代码?您的理解是100%正确的,这正是您想要做的
我猜你没有重新启动Sidekiq来获取你的代码更改。Sidekiq不会像Rails那样自动重新加载已更改的代码。直到计划的时间才调用
some\u email
方法。问题是否可能出在是否有资格接收电子邮件中?
?你能把那个方法的代码贴出来吗?当然。顺便说一句,当我打电话给Mailer.some_email(user.id)。deliverIsemail\u sent
在适当的日期设置,还是在邮件排队后立即设置?当调用some\u email
方法时,这将确切地告诉您。另外,unsubscribed
是一个简单的布尔属性还是一种方法?好的,让我检查一下-我将延迟时间改为5.5分钟;yes unsubscribed是一个默认为false的布尔值。感谢您回答Mike:)请原谅我的无知-Sidekiq是否缓存了要运行的代码?所以在2天内,当它执行这个方法时,它会执行一个为自己保留的副本?我会按照你的建议尽快尝试。@edralph你解决问题了吗?我正在努力实现同样的目标。