ruby-on-rails - 日期范围和事件天数在 rails 上

标签 ruby-on-rails ruby postgresql ruby-on-rails-4 postgresql-9.3

对于您来说,将某些事件日期范围存储到数据库中的最佳方式是什么?如果您之后需要检查一个月中每天有多少事件? 例子

1st event from 12/07 to 15/07
2th event from 14/07 to 17/07
3th event just at 15/07

如果我通过一个查询检查数据库,我希望得到这样的结果:

12/07,(1 event) 
13/07,(1 event) 
14/07,(2 event) 
15/07,(3 event) 
16/07,(1 event) 
17/07,(1 event)

如果我使用 start_day 和 end_day 来存储一些事件,那么我可能会遇到一个小问题:

如果我使用那 2 个元素(start_day 和 end_day),我只选择该日期之间有多少事件,而不是每天有多少事件,例如,如果您有 1 个事件并且持续时间为 3 天(从 11 到 14)和另一个 2 天的事件(从 12 到 14),如果我检查有多少事件我有 13 我什么都没有,因为日期没有出现但是如果我检查 SELECT * FROM event BETWEEN date_begin AND date_end

最佳答案

这在 Ruby 中进行后处理要简单一些。假设您有以下 date_begindate_end:

date_begin = Date.new(2015, 7).beginning_of_month
date_end = Date.new(2015, 7).end_of_month

然后就可以查询指定范围内的事件了

Event.where('start_day >= ? AND end_day <= ?', date_begin, date_end)

要获得每天的计数,您可以像这样对结果进行后处理

Event.where('start_day >= ? AND end_day <= ?', date_begin, date_end)
  .flat_map{|event| (event.start_day..event.end_day).to_a }
  .each_with_object(Hash.new(0)){|day, counts| counts[day] += 1 }

如果你真的想用纯 SQL 来做,你可以在指定范围内生成一个日期序列,然后将其加入到事件表中。

results = ActiveRecord::Base.connection.execute <<-SQL
  SELECT day, count(events) FROM (
    SELECT day
    FROM generate_series('#{date_begin}'::date, '#{date_end}', '1 day')
    AS day
  ) days
  INNER JOIN events
  ON day BETWEEN start_day AND end_day
  GROUP BY day
SQL

如果你想把它变成一个看起来像第一种方法的哈希,你可以这样做

results.map{|r| [r['day'].to_date, r['count'].to_i] }.to_h

这两种方法都会产生以下结果:

{
  Sun, 12 Jul 2015=>1,
  Mon, 13 Jul 2015=>1,
  Tue, 14 Jul 2015=>2,
  Wed, 15 Jul 2015=>3,
  Thu, 16 Jul 2015=>1,
  Fri, 17 Jul 2015=>1
}

关于ruby-on-rails - 日期范围和事件天数在 rails 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33094062/

相关文章:

ruby-on-rails - 一致的测试错误(Rspec-core 2.14.5)

ruby-on-rails - 什么会导致 Rails 页面缓存停止工作?

ruby-on-rails - Rails html.erb 文件类型,<% %> 和 <%= %> 的区别

ruby-on-rails - 合并两个 find_bys 的结果

javascript - 如何在 RubyRacer 中评估 HTML DOM 对象(如 "document")

ruby - 输出一个ruby方法的源码

sql - Postgres : match pattern after GROUP BY

ruby - ruby中斜杠的作用是什么

postgresql - PGBouncer : Cant connect on the right db

sql - pg_restore 清理表 psql