ruby-on-rails - 使用设备向用户重新发送确认指令

标签 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来安排这个任务。

最佳答案

您的代码看起来没问题,但是当您对太多用户执行 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/

相关文章:

ruby-on-rails - 在 Windows 中执行 cron 时运行

ruby-on-rails - AWS Elastic Beanstalk 和 Every Gem

ruby-on-rails - 每当 gem 崩溃时 Rails 控制台方法自动完成

ruby-on-rails - 运行 cron 作业时出错 `require' : cannot load such file -- bundler/setup (LoadError)

css - 我只能在 Sass 中使用嵌套

ruby-on-rails - 如何设置 config.action_controller.default_url_options = { :host = '#' '} on per environment basis

ruby-on-rails - 如何编写 Devise 扩展(使用自定义数据存储)

ruby-on-rails - Rails - 查找或创建 - 用于和数组?

ruby-on-rails - Rails 3.1 和 Ruby 1.9.3p125 : ruby-debug19 still crashes with "Symbol not found: _ruby_threadptr_data_type"

ruby-on-rails - 如何根据表列安排任务?