Ruby on Rails - 更改 rake 任务中的列值

Ruby on Rails - Change column value in rake task

如果 MailCourseWarn.where(needs_warned: true),我有一个发送电子邮件的 rake 任务。我希望在发送电子邮件后,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

我该怎么做?我试图结束任务 user.needs_warned = false,但没有用。

谢谢。

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

您可以在 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

@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|