如何在一天结束时将布尔值重置为 "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
我会使用时间戳而不是布尔值。这有两个好处:
- 你知道用户最后一次完成是什么时候
- 您不需要在午夜通过 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
我在数据库中有一个布尔值: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
我会使用时间戳而不是布尔值。这有两个好处:
- 你知道用户最后一次完成是什么时候
- 您不需要在午夜通过 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