mysql - 如何按日期范围管理记录?

标签 mysql ruby-on-rails

在我的 Rails 应用程序中,我的数据库表 tariffs 中有以下结构:

  +------------+---------+
  |   Date     |  Value  |
  +------------+---------+
  | 01/01/2018 |    1    |
  | 02/01/2018 |    2    |
  | 03/01/2018 |    2    |
  | 04/01/2018 |    2    |
  | 05/01/2018 |    3    |
  | 06/01/2018 |    3    |
  | 07/01/2018 |    3    |
  | 08/01/2018 |    2    |
  +------------+---------+

在我看来,我想要这样的东西:

  +-------------------------+---------+----------+
  |           Date          |  Value  |  Actions |
  +-------------------------+---------+----------+
  | 01/01/2018 - 01/01/2018 |    1    |   Delete |
  | 02/01/2018 - 04/01/2018 |    2    |   Delete |
  | 05/01/2018 - 07/01/2018 |    3    |   Delete |
  | 08/01/2018 - 08/01/2018 |    1    |   Delete |
  +-------------------------+---------+----------+

我想按日期范围管理一批关税,而不是单独管理每条记录。

如何按上述日期范围对值进行分组?

最佳答案

Tariff.all.group_by(&:value).map{
    |k, v| {k=> v.map{|elem| elem.date}}
}.reduce({}, :merge).map{
    |k, v| {k => v.minmax}
}
  1. 获取所有关税并按值(value)进行分组 ( group_by )
  2. 将日期提取到新数组 ( map )
  3. 将哈希数组转换为单个哈希 ( reduce )
  4. 最终获取最小和最大日期 ( minmax )
<小时/>

输出:

[{1=>[Mon, 01 Jan 2018, Mon, 01 Jan 2018]},
{2=>[Tue, 02 Jan 2018, Thu, 04 Jan 2018]},
{3=>[Fri, 05 Jan 2018, Sun, 07 Jan 2018]}, ...]
<小时/>

添加评论:

如果我猜对了,这将为您提供预期的输出:

tariffs = Tariff.all
grouped = [tariffs.first.value => [tariffs.first.date]]
prev = nil
tariffs.drop(1).each do |t|
    if prev.present? && t.value == prev.value
        grouped.last.values.first.push(t.date)
    else
        grouped.push(t.value => [t.date])
    end
    prev = t
end

grouped.map{|g| {g.keys.first => g.values.first.minmax}}

您可以将其包装为Traffic的类方法

关于mysql - 如何按日期范围管理记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48558729/

相关文章:

mysql - MySQL 数据库中所有行的精确计数

ruby-on-rails - 如何防止 has_and_belongs_to_many 删除选项删除 Rails 中正在使用的记录?

ruby-on-rails - Active Record 通过关系查询来查找其关系都不具有值的记录

mysql - 在 mySQL 中平均子查询的结果

mysql - 避免在 mysql 插入中重复

php - 从数据库中的所有表中选择所有数据并打印到一个表中

php - 在PHP中,如何实现和Java中StringTokenizer一样的目的?

ruby-on-rails - Rails 'link_to' 立即下载图像而不是在浏览器中打开它

ruby-on-rails - 如何使用相同的Rpec测试来测试Rails项目的生产版本?

ruby-on-rails - Devise 注册后立即在 Controller 中执行某些操作