如何将布尔值重置为"默认值:false"在一天结束?

时间:2015-07-19 18:35:35

标签: ruby-on-rails ruby database boolean

我在DB中有一个布尔值:t.boolean "completed", default: false

在主页上显示那些false

如果用户选中一个:

<span class="glyphicon glyphicon-ok"><% :completed %></span>

已完成变为true,因此会从主页上消失。

但是,在每天结束时,我们如何自动将所有内容重置回default: false

我是否要创建模型方法或范围来执行此操作?

3 个答案:

答案 0 :(得分:1)

我认为你实际上需要一个rake任务来重置它们,然后每天用cron运行一次。看看每当宝石。

你可以在没有rake任务的情况下完成它,但它有点困难和低效,你必须添加一个completed_timestamp,并在设置为true时将其设置为当前时间。然后,每当您获取模型时,检查completed_timestamp是否在今天之前,如果是,则在呈现页面之前将其设置为false。您可以在after_find回调中执行此操作。

编辑:我强烈建议您使用cron + rake任务解决方案,第二种方法非常低效,因为每次加载页面时都必须获取每条记录并检查其时间戳。它只是一个可怕的解决方案,但我添加它是为了完整。

答案 1 :(得分:1)

您可以使用whenever gem创建rake task。像下面的东西应该工作

every 1.day, :at => '12:00 am' do
  runner "YourModel.method_to_update"
end

在您的模型中,编写如下方法

def self.method_to_update
  YourModel.update_attribute(completed: false)
end

答案 2 :(得分:1)

我会使用时间戳而不是布尔值。这有两个好处:

  1. 您知道上次用户何时进行了汇总
  2. 您无需在午夜通过cron作业重置该值。
  3. 步骤如下:首先从数据库中删除completed布尔列,然后添加completed_at时间戳列。

    第二步为模型添加两个方法,允许与之前的布尔列相同的行为。这意味着无需更改控制器或视图:

    def completed=(boolean)
      self.completed_at = boolean ? Time.current : nil
    end
    
    def completed
      completed_at && completed_at >= Time.current.beginning_of_day
    end