我在DB中有一个布尔值:t.boolean "completed", default: false
我仅在主页上显示那些false
。
如果用户选中一个:
<span class="glyphicon glyphicon-ok"><% :completed %></span>
已完成变为true
,因此会从主页上消失。
但是,在每天结束时,我们如何自动将所有内容重置回default: false
?
我是否要创建模型方法或范围来执行此操作?
答案 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)
我会使用时间戳而不是布尔值。这有两个好处:
步骤如下:首先从数据库中删除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