代码之家  ›  专栏  ›  技术社区  ›  Felipe Marcon

ruby on rails-更改rake任务中的列值

  •  1
  • Felipe Marcon  · 技术社区  · 6 年前

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

    rake任务:

    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 ,但不起作用。

    谢谢。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Rohit Lingayat    6 年前

    您可以在中更新该列 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
  •  1
  •   Phlip    6 年前

    user.update! needs_warned: false 工作?你的版本正在更改记录,然后扔掉它而不保存它…

        3
  •  0
  •   Philipp Alexander Frank    6 年前

    @菲利普是对的。甚至可以通过将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| )