使用设计

时间:2015-10-16 15:08:24

标签: ruby-on-rails whenever

如果用户在注册后未确认其帐户,我想向用户重新发送确认说明。我正在使用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来安排这项任务。

1 个答案:

答案 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
相关问题