【问题标题】:model method trigger boolean to true?模型方法触发布尔值为真?
【发布时间】:2016-06-20 08:22:54
【问题描述】:

如何在days_left_challenged == 0 上触发方法accomplished_challenge

挑战.rb

  before_save :days_left_challenged_sets_deadline

  # makes ongoing_challenge become past (before_save) THIS WORKS
  def days_left_challenged_sets_deadline
    if self.date_started != nil 
      if days_left_challenged <= 0
        self.accomplished = true
        self.deadline = self.date_started
      end
    end
  end

  # makes ongoing_challenge become past (whenever gem) THIS DOESN'T
  def self.accomplished_challenge
    self.all.each do |challenge|
      if challenge.days_left_challenged <= 0
        challenge.accomplished = true
        challenge.deadline = self.date_started
      end
    end
  end

 # Counts down how many days left in days_challenged using committed
 def days_left_challenged
   self.days_challenged - ((date_started.to_date)..Date.yesterday).count do |date| 
     committed_wdays.include? date.wday
   end + self.missed_days
 end

挑战.last

 id: 1,
 action: "Run",
 committed: ["sun", "mon", "tue", "wed", "thu", "fri", "sat", ""],
 date_started: Sat, 06 Feb 2016 00:00:00 EST -05:00,
 deadline: nil,
 accomplished: nil,
 days_challenged: 10,
 missed_days: 0,

我无法通过回调或验证来触发它,因为days_left_challenged 可以在挑战的任何时候转向0

【问题讨论】:

    标签: ruby-on-rails ruby methods triggers model


    【解决方案1】:

    我建议您使用像 Whenever 这样的 gem 来设置一个每天运行的 cron 作业,并检查所有挑战。它会是这样的:

    every 1.day, :at => '0:01 am' do
      runner "Challenge.accomplished_challenge"
    end
    

    您的accomplished_challenge 必须是一个类方法,可以检查所有(或您使用过滤器选择的)挑战:

    def self.accomplished_challenge
      self.all.each do |challenge|
        if challenge.days_left_challenged == 0
          challenge.update_attributes(deadline: self.date_started, accomplished: true)         
        end
      end
    end
    

    ---- 编辑 Heroku ----

    /lib/tasks/scheduler.rake上创建一个任务:

    # /lib/tasks/scheduler.rake
    
    desc "This task is called by the Heroku scheduler add-on"
    task :check_accomplished_challenges => :environment do
      puts "Checking accomplished challenges..."
      Challenge.accomplished_challenge
      puts "done."
    end
    

    转到您的 Heroku 应用资源页面并添加“Heroku 调度程序”。打开调度器并添加任务:

    rake check_accomplished_challenges
    

    将其设置为每天运行。 更多详情:https://devcenter.heroku.com/articles/scheduler

    【讨论】:

    • 感谢您的回答!出于某种原因,虽然它没有工作。我捆绑安装gem 'whenever', :require =&gt; false。然后wheneverize . 然后我将您的顶部代码添加到schedule.rb 并将您的底部代码添加到challenge.rb。我昨天做了一个挑战,今天会点击challenge.days_left_challenged == 0,然后今天检查它是否更新了accomplished = truechallenge.deadline = self.date_started,但它没有:/感谢您的尝试。
    • 您的服务器是否在凌晨 0:01 运行?
    • 我是在生产环境中使用 heroku 完成的
    • 它不适用于heroku。我将更新我的答案以使其正常工作。
    • 嘿Akz。这两天我一直在尝试制作并查看您的代码是否有效,但我无法做到。我每小时制作一次频率进行测试。根据 Heroku Scheduler,它最后一次运行 Mar 11 18:21 UTC。然后,当我查看具有challenge.days_left_challenged &lt;= 0 accomplisheddate_startedchallenge 仍然是nil
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    相关资源
    最近更新 更多