2014-07-02 55 views
0

我有一个典型的ActionMailer,它有一个指定电子邮件传递的方法。处理作业时是否延迟执行Sidekiq Mailer方法?

def some_email(user_id) 
@user = User.find(user_id) 

    if @user.eligible_for_email? 
    mail(to: @user.email, from: "[email protected]", subject: "The Subject") 
    @user.email_sent = Date.today 
    @user.save 
    end 
end 

我不想耽误这一点使用Sidekiq的发送所以我用:

Mailer.delay_for(2.days).some_email(user.id) 

的eligible_for_email方法:

def eligible_for_email? 
    !unsubscribed? && email_sent.nil? 
end 

在此期间,用户可以有退订,这为什么在用户模型中有一种方法叫做eligible_for_email?,我可以用它来有条件地发送电子邮件 - 但显然这种情况需要在电子邮件发出之前进行测试nt,而不是在工作安排时。

所以问题是,当我使用Sidekiq来处理这个问题时,条件逻辑在作业完成时似乎没有运行。

Sidekiq是否在运行时执行some_email方法,然后将产生的电子邮件排队等待两天后发送出去,从而否定了我的条件代码?

+0

'some_email'方法直到预定时间才被调用。这个问题可能在'eligible_for_email?'中吗?你可以发布该方法的代码? – infused

+0

当然。 BTW它工作正常,当我打电话Mailer.some_email(user.id).deliver – edralph

+0

是否'email_sent'被设置在适当的一天或它被设置为邮件入队后?这会告诉你何时调用'some_email'方法。另外,'unsubscribed'是一个简单的布尔属性,还是一种方法? – infused

回答

1

你的理解是100%正确的,这正是你想要做的。

我猜你没有重新启动Sidekiq来取代你的代码更改。 Sidekiq不会像Rails那样自动重新加载更改后的代码。

+0

感谢您回答Mike :)请原谅我的无知 - Sidekiq缓存要运行的代码吗?因此,在执行该方法的两天内,它会执行一个它自己保留的副本?尽可能快地尝试你的建议。 – edralph

+0

@edralph你解决了你的问题吗?我试图达到同样的目的。 – acrogenesis