Ruby on Rails - 更改 rake 任务中的列值
Ruby on Rails - Change column value in rake task
如果 MailCourseWarn.where(needs_warned: true)
,我有一个发送电子邮件的 rake 任务。我希望在发送电子邮件后,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
我该怎么做?我试图结束任务 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|
)
如果 MailCourseWarn.where(needs_warned: true)
,我有一个发送电子邮件的 rake 任务。我希望在发送电子邮件后,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
我该怎么做?我试图结束任务 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|
)