В моем проекте rails (with postgresql) у меня есть Event-модель с start_date
и end_date
полями. Диапазоны дат события не могут перекрываться. Я хочу получить все даты с событием.Активная запись: получить все даты в нескольких диапазонах
Например:
| event id | start_date | end_date |
| :------: | :--------: | :--------: |
| 51 | 2011-09-27 | 2011-09-29 |
| 70 | 2014-07-23 | 2014-07-26 |
| 71 | 2014-06-30 | 2014-07-01 |
| 77 | 2016-03-10 | 2016-03-11 |
Выход:
[
2011-09-27,
2011-09-28,
2011-09-29,
2014-07-23,
2014-07-24,
2014-07-25,
2015-08-26,
2014-06-30,
2014-06-31,
2014-07-01,
2016-03-10,
2013-03-11
]
Я стараюсь делать много и получить результат с этим кодом:
Event
.pluck(:start_date, :end_date)
.map(&:compact).reject(&:empty?) # I have events with null start_date and end_date
.map{ |start_date, end_date|
(start_date.to_date..end_date.to_date).map(&:to_s)
}
.flatten
Но я думаю, что это некрасиво , есть ли элегантный способ решить мою проблему? Может быть, с postgresql, но я новичок в postgresql.
Ваш код будет выглядеть лучше, если вы просто реорганизован вокруг метода объема и экземпляра, так что вы можете: Event.has_start_and_end.dates_in_range.flatten –