如果用户在注册后未确认其帐户,我想向用户重新发送确认说明。我正在使用rails 4.我有这个代码,但它没有用。
def resend_confirmation_instructions
users = User.where('confirmed_at IS ?', nil)
users.each do |user|
if (user.created_at < (Date.today - 8))
end_date = (user.created_at.to_date)
start_date = Date.today()
date_diff = (start_date - end_date).to_i
if (date_diff == 3) or (date_diff == 6)
user.send_confirmation_instructions
end
end
end
end
我每天都会使用gem来安排这项任务。
答案 0 :(得分:3)
您的代码似乎没问题,但是当您users.each
用户太多时,可能会出现性能问题。
基本上users
将是ActiveRecord::Relation
,它是包含查询参数集合的对象。在其上调用each
会将其转换为Array
,因为查询将被执行。如果你有太多的对象,那可能会破坏你的数据库或ruby进程。
使用find_each
怎么样,看看它是否有所作为?
您正在加载许多您可能不需要的用户,因为您正在循环中执行此检查:
user.created_at < (Date.today - 8)
这是影响性能并杀死进程的其他因素。最好将该过滤器添加到活动记录查询中。
尝试:
def resend_confirmation_instructions
today = Date.today
users = User.where(confirmed_at: nil)
.where('created_at < ?', (today - 8))
users.find_each(batch_size: 100) do |user|
end_date = user.created_at.to_date
date_diff = (today - end_date).to_i
if date_diff == 3 || date_diff == 6
user.send_confirmation_instructions
end
end
end