2016-08-02 5 views
2

Я создаю диапазон для каждого месяца в моем примере.Ruby: Группировка диапазона дат по годам и месяцам

example_range = (Time.zone.today..2.years.from_now) 

Вывод должен выглядеть так:

=> [Wed, 03 Aug 2016..Wed, 31 Aug 2016, Thu, 01 Sep 2016..Fri, 
30 Sep 2016, Sat, 01 Oct 2016..Mon, 03 Oct 2016, ...] 

На данный момент я делаю это, что не работает для диапазонов дольше, чем на год, потому что группировка поместит января '16 и Январь '17 в одной группе.

example_range.group_by(&:month).each { |_, month| month.first..month.last } 

Я также попытался это, но рубин это на ошибку сегментации по какой-то причине ...

example_range.group_by(&:year).map{ |ary| ary.group_by(&:month)} 

Кто-нибудь знает более красивый (или, по крайней мере, рабочий) способ сделать это?

+0

1. Это должно быть вопрос, а не вопрос и ответ , Вы должны удалить раздел «Решение». Если вы хотите сказать, что используете конкретное решение, сделайте это как комментарий к соответствующему ответу. Если вы хотите предложить ответ самостоятельно, сделайте это как ответ. 2. Этот вопрос требует примера. Когда вы приводите пример, покажите ожидаемый или желаемый результат и назначьте переменную каждому входному объекту (например, 'arr = [1,2,3]'), чтобы читатели могли ссылаться на эти переменные в ответах и ​​комментариях, а не определять их в их ответ. –

+0

спасибо @CarySwoveland, я улучшил свой вопрос. – andialles

+0

Намного лучше ... –

ответ

2

Как это:

example_range.group_by {|date| [date.year, date.month] }.map {|_, month| month.first..month.last } 

Если вы используете Active Support (Rails), это также будет работать:

example_range.group_by(&:beginning_of_month).map {|_, month| month.first..month.last } 
+0

я в конечном итоге делает это: 'example_range.group_by (&: beginning_of_month) .each {| _, месяц | month.first..month.last} ' – andialles

0

Лучшее решение, я думаю, это:

example_range.group_by {|date| date.month.to_s + "-" + date.year.to_s} 

Вы можете настроить так, как вам нужно.

+0

спасибо, что сделал трюк – andialles

+0

вы радушны;) – rneves

Смежные вопросы