Ruby on Rails - 更改rake任务

时间:2018-06-03 16:12:22

标签: ruby-on-rails ruby rake-task

我有一个rake任务,如果MailCourseWarn.where(needs_warned: true)发送电子邮件。我希望在发送电子邮件后,needs_warnedfalse而不是true

佣金任务:

namespace :course_available do
  desc 'Disparando e-mail de curso disponível'

  task :warn_user => :environment do |t, args|
    MailCourseWarn.where(needs_warned: true).each do |user|
      if user.course.start_at < Date.today
        MailCourseWarnMailer.delay_for(1.seconds, retry: true).course_available(user)
      end
    end
  end
end

我该怎么做?我试图结束tak user.needs_warned = false,但没有效果。

感谢。

3 个答案:

答案 0 :(得分:1)

user.update! needs_warned: false是否有效?您的版本正在更改记录,然后将其丢弃而不保存...

答案 1 :(得分:1)

您可以在if条件下更新该列。 user.update_attribute(:needs_warned, false)

例如:

namespace :course_available do
  desc 'Disparando e-mail de curso disponível'

  task :warn_user => :environment do |t, args|
    MailCourseWarn.where(needs_warned: true).each do |user|
     if user.course.start_at < Date.today
       MailCourseWarnMailer.delay_for(1.seconds, retry: true).course_available(user)
       user.update_attribute(:needs_warned, false)
     end
    end
  end
end

答案 2 :(得分:0)

@Philip是对的。通过将if条件内联到SQL查询并执行批量更新,甚至可以改进代码。这样,您最终只会得到两个SQL查询:(1)用于检索与您的条件匹配的记录,以及(2)用于批量更新。否则,您的代码最终可能会执行大量查询。

namespace :course_available do
  desc 'Disparando e-mail de curso disponível'

  task :warn_user => :environment do
    results = MailCourseWarn
      .joins(:courses)
      .where('needs_warned = ? AND courses.start_date < ?', true, Date.today)

    results.each do |user|
      MailCourseWarnMailer.delay_for(1.seconds, retry: true).course_available(user)
    end

    results.update_all(needs_warned: false)
  end
end

请注意,我还简化了一些代码(删除了不必要的|t, args|