【问题标题】:How to query an adjacent previous record to another record you look up in Rails with Active Record?如何使用 Active Record 查询您在 Rails 中查找的另一条记录的相邻先前记录?
【发布时间】:2020-07-14 14:11:49
【问题描述】:

我正在构建一个 Rails 应用程序以从 Johns Hopkins Covid-19 Github project 中提取数据并计算病例和死亡人数的每日增长率。我开始这样做是因为我想查看我所在城市纳什维尔每天的数据变化。目前,我有一个硬编码的 html 表,you can see here,但我正在尝试使其动态化,以便它适用于美国的每个县。

此时,我无法尝试对数据库进行建模并在 before_save 回调中计算每日增长率,因为我不确定如何查找所需的记录。

什么是在 Rails 中找到与您正在查找的记录相邻的记录的一种不错的方法?我什至不确定如何用英语说清楚,这可能是我无法将其写入代码的问题的根源。比如今天vs昨天OR 3月28th vs. 3月27th OR 3月31th vs 3月30th等等。我需要根据日期找到第一条记录,然后找到前一天的最后一条记录。

应该类似于这个before_save回调:

def calculate_case_growth_rate
  current_cases  = self.cases
  previous_cases = Update.where(date: 1.day.ago).sum(:cases)
  self.case_growth_rate = (current_cases - previous_cases) / current_cases
end

这是发生回调的the model

但是,这种方法行不通,因为有时数据可能不正确,需要更新。例如,田纳西州卫生部门可能会发现他们 3 月 31 日的数据有误,因此约翰霍普金斯大学的数据得到更新,因此我的数据库中的记录也需要更新。因此,对于我上面的代码,第一次发生这种情况时,它会调用 Update.last 并为 3 月 31 日保存不正确的增长率。因此,无论是计算今天与昨天的增长率还是 3 月 28 日与 3 月 27 日的增长率等,我都需要回调来工作。

这是一个开放项目,所以整个应用程序是here。 (如果您想直接提供帮助,请发送拉取请求!)

【问题讨论】:

    标签: ruby-on-rails ruby postgresql activerecord


    【解决方案1】:

    据我了解,您需要前一天的案例。因此,假设今天是 4 月 2 日,那么您需要 4 月 1 日的情况,然后计算增长率。要获取前一天的案例,您可以做这样的事情。 Update.where(date: 1.day.ago) 这将返回前一天的案例。 我已经从您的架构中查找了 date 属性。希望对你有帮助

    更新:所以要求是从相对于当前日期的前一个日期获取案例,然后计算案例的增长率,计算公式为

        before_save :calculate_case_growth_rate
    
        def calculate_case_growth_rate
          current_cases  = self.cases
          previous_cases = Update.where(date: (self.date - 1.day)).sum(:cases)
          self.case_growth_rate = ((current_cases - previous_cases) / current_cases)
        end
    

    【讨论】:

    • 谢谢。这就说得通了。我猜是因为 rails 已经从数据库中拉出适当的记录进行编辑,那么您只需要知道相对于 self 的记录 1.day.ago。在使用 .where(1.day.ago) 找到该记录后,如何为该记录提取正确的属性?在控制台中 Update.where(date: 1.day.ago) 返回正确的记录,但 Update.where(date: 1.day.ago).cases 应该返回一个整数,但它返回一个未定义的方法“cases”错误.像 Update.last.cases 这样的东西返回带有案例数的整数。该模式不应该与 .where 一起使用吗?
    • 最终得到了这个cases_yesterday = Update.where(date: 1.day.ago).pluck(:cases).join.to_i,但这只是相对于今天的日期。对此有什么想法吗?
    • 是的 1.day.ago 绝对是从今天开始的 1 天。不是有问题的记录。如果编辑 3 月 28 日和 29 日会怎样?更新 3 月 29 日时,如何从数据库中以整数形式获取 3 月 28 日的案例?
    • Update.where(date: 1.day.ago) 返回一个可以包含 0 条或更多条记录的数组。在数组上调用 Update.where(date: 1.day.ago).cases 将不起作用。调用 .cases 应该有一个 activerecord 对象,因为它是对象的一个​​属性
    • 如果有多个更新,比如说 3 月 28 日,那么你可以做的是将它们相加Update.where(data: yourDate).sum(:cases) 这也适用于一种情况,因为数组和一个数字的总和是相同的号码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多