如果用户注册后未确认其帐户,我想向用户重新发送确认指令。我正在使用 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来安排这个任务。
最佳答案
您的代码看起来没问题,但是当您对太多用户执行 users.each
时,可能会出现性能问题。
基本上,users
将是一个 ActiveRecord::Relation
,它是一个包含查询参数集合的对象。对其调用 each
会将其转换为 Array
,从而导致执行查询。如果您有太多对象,可能会终止您的 DB 或 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
关于ruby-on-rails - 使用设备向用户重新发送确认指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33173812/