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

How to reset boolean to "default: false" at end of day?

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

在主页上显示那些仍然false

如果用户勾选了一个:

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

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

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

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

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

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

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

您可以使用 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

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

  1. 你知道用户最后一次完成是什么时候
  2. 您不需要在午夜通过 cron 作业重置该值。

步骤是:首先从数据库中删除 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