【发布时间】:2017-01-06 00:50:23
【问题描述】:
我正在使用带有 Devise confirmable 的 Rails。当用户注册时,Devise 会自动向他们发送一封确认电子邮件。如果他们三天后仍未确认,我想向他们发送另一封带有新令牌的确认电子邮件。如果他们在第二封电子邮件后仍未确认,我们不应再向他们发送。绘制在时间线上:
- 第 1 天: 用户注册并收到确认电子邮件;不确认
- 第 2 天:用户未确认
- 第 3 天: 发送另一封电子邮件,提示他们确认;不确认
- 第 4 天: 用户未确认;不再发送电子邮件
- 第 5 天: 用户未确认;不再发送电子邮件
- 第 6 天: 等等。
我不想在我的用户模型中添加一个新列来跟踪他们收到了多少次确认电子邮件,因为我认为我可以在每天运行的 Worker 中使用我们已经拥有的信息来完成它有。但是,我在正确处理逻辑方面有点挣扎。
这是我目前所拥有的:
# workers/resend_confirmation_worker.rb
class ResendConfirmationWorker
include Sidekiq::Worker
sidekiq_options queue: :resend_confirmation, retry: false
def perform
users = User.where('confirmation_sent_at IS NOT NULL and
confirmed_at IS NULL')
users.each do |user|
return if user.created_at < Time.zone.now - 4.days || user.created_at > Time.zone.now - 3.days
user.resend_confirmation!
end
end
# config/clock.rb
module Clockwork
every(1.day, 'Resend confirmation') { ResendConfirmationWorker.perform_async }
end
感谢任何帮助或改进建议。
【问题讨论】:
-
使用
.find_each分批加载记录以避免潜在的耗尽可用内存。
标签: ruby-on-rails devise devise-confirmable