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

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

在主页上显示那些仍然是false的。

如果用户选中一个:

  

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

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

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

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

  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 

我想你实际上想要一个rake任务来重置它们,然后每天用cron运行一次。 随时看看gem。

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

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

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