【问题标题】:Update database after duration (Ruby on Rails)持续时间后更新数据库(Ruby on Rails)
【发布时间】:2011-01-19 03:31:26
【问题描述】:

我有一个包含两个字段的循环模型:持续时间(字符串)和已完成(布尔值)。当用户创建一个周期时,他们输入持续时间(比如说 30 分钟)并且周期设置为未完成(布尔值 0)。如何在循环持续时间(30 分钟)后更新该数据库条目以将循环标记为完成(布尔值 1)?有没有办法用 ruby​​/rails 代码来处理这个问题,还是我必须执行一个 javascript 函数?

目标是能够使用 Cycle.all(:conditions..) 找到并显示所有已完成的循环并调用 SQL 数据库。我写了一个“完整的?”循环模型中的方法,用于将循环的年龄与持续时间进行比较,但这对于 SQL 查找方法无用。

解决这个问题的最佳方法是什么?谢谢!

【问题讨论】:

    标签: ruby-on-rails auto-update duration


    【解决方案1】:

    定义一个运行类似...的 rake 任务

    desc "Expire old cycles"
    task :cron => :environment do
      expired = Cycle.all :conditions => ["expiration < ?", DateTime.now]
      expired.each { |c| c.expire! }
    end
    

    c#expire! 是一种在数据库中将其标记为过期的方法。然后设置 rake cron 通过 cronjob 每 N 分钟运行一次。

    如果您习惯在 SQL 中执行此操作,则可以通过编写查询来优化此操作以执行 UPDATE cycles SET complete = 1 WHERE expiration &lt; NOW();

    【讨论】:

    • 如果没有 cron 作业,我有什么办法可以做到这一点?这将在工厂环境中使用,其中周期的状态很重要,因此它应该精确到一分钟,这需要每分钟运行一个 cron 作业。在共享服务器上,我读到这不好。
    • 您可以将性能更高的原始 SQL 查询附加到发出的每个请求中,因此它将在使用应用程序时自动运行。但是,如果这是您的目标,您不能告诉数据库按计划自动执行此操作。
    • 根据您打算如何与此数据交互,索引数据库中的过期列并使用时间比较条件仅拉出未过期的行懒惰(此时此刻)是也是一个非常可接受的选择。
    • @aguynamedloren 在数据库较大时更新所有记录似乎很慢,因为它会多次运行重复记录
    【解决方案2】:

    您可以添加另一个字段,例如Expired_time,即循环完成时。例如:

    # Here is the example record:
    Duration  Created_at  Expired_time
    30 mins   Time        Time + 30 mins
    

    现在只需使用 Expired_time 检查当前日期(现在)来检查它是否完整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      相关资源
      最近更新 更多