【问题标题】:How to reset boolean to "default: false" at end of day?如何在一天结束时将布尔值重置为“默认值:false”?
【发布时间】:2015-07-19 18:35:34
【问题描述】:

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

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

如果用户勾选一项:

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

Completed 变为 true,因此从主页上消失。

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

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

【问题讨论】:

  • 您可以创建rake taskcompleted 的值设置为false

标签: ruby-on-rails ruby database boolean


【解决方案1】:

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

  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

【讨论】:

  • 嘿斯派克曼!那么我是否要从数据库中删除completed,如果是这样,我会在视图中添加什么来代替它,&lt;% :completed? %&gt;?这是否意味着如果单击该事物会消失,然后在明天开始时重新出现?感谢您的帮助!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-09-03
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 2019-11-09
      相关资源
      最近更新 更多