我有一个rake任务,如果MailCourseWarn.where(needs_warned: true)
发送电子邮件。我希望在发送电子邮件后,needs_warned
为false
而不是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
,但没有效果。
感谢。
答案 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|
)