2016-08-02 17 views
2

Ich erstelle einen Bereich für jeden Monat in meinem Beispielbereich.Ruby: Gruppieren eines Datumsbereichs nach Jahr und Monat

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

Ausgabe sollte wie so aussehen:

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

Im Moment dieses ich tue, die nicht länger als ein Jahr für Bereiche nicht funktioniert, weil die Gruppierung '16 Januar gestellt wird und Januar '17 in einer Gruppe.

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

Ich habe auch versucht das, aber auf diese Rubin segfaults aus irgendeinem Grund ...

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

Kennt jemand eine schönere (oder zumindest arbeiten) Art und Weise, dies zu tun?

+0

1. Dies ist eine Frage sein sollte, nicht eine Frage und eine Antwort . Sie sollten den Abschnitt "Lösung" entfernen. Wenn Sie sagen möchten, dass Sie eine bestimmte Lösung verwenden, tun Sie dies als Kommentar zur zutreffenden Antwort. Wenn Sie selbst eine Antwort geben möchten, tun Sie es als Antwort. 2. Diese Frage bittet um ein Beispiel. Wenn Sie ein Beispiel angeben, zeigen Sie das erwartete oder gewünschte Ergebnis an und weisen Sie jedem Eingabeobjekt eine Variable zu (z. B. 'arr = [1,2,3] '), damit die Leser auf diese Variablen in Antworten und Kommentaren verweisen können ihre Antwort. –

+0

danke @CarySwoveland, ich habe meine Frage verbessert. – andialles

+0

Viel besser ... –

Antwort

2

Wie dies:

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

Wenn Sie Active Support (Rails) verwenden, wird dies auch funktionieren:

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

ich das am Ende tun: 'example_range.group_by (&: beginning_of_month) .each {| _, Monat | Monat.erstes..Monat.letztes} ' – andialles

0

Die beste Lösung, die ich denke, ist dies:

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

Sie die Art und Weise anpassen können Sie benötigen.

+0

Dank, dass der Trick – andialles

+0

Sie sind willkommen;) – rneves