2012-09-21 24 views
10

Ich bin auf Ruby 1.9.2, Rails 3.0.x und ich benutze MySQL DB. Ich habe ein Nachrichtenmodell, in dem man jeden Tag neue Nachrichten schreiben kann.Gruppendatensätze nach Monat und Jahr in Rails

Ich habe eine Indexaktion, wo ich diese Nachrichten nach Monat und Jahr gruppiert anzeigen möchte. Dies wird im Grunde verwendet, um Nachrichten zu filtern.

Meine Abfrage sieht wie folgt aus: -

@active_msgs = Messages.where('expiry > ?', Time.now).order('created_at DESC') 

ich die group_by Funktion in Rails verwendet, nach this post

Meine Gruppe von Query bezieht, ist: -

@msgs_by_month = @active_msgs.all.group_by {|u| u.created_at.month } 

Ich war hat einen Hash namens @msgs_by_month zurückgegeben. Dies half mir, die Nachrichten nach Monat zu gruppieren, aber ich muss das Jahr berücksichtigen, um einen eindeutigen Schlüssel zu bilden, da es mir helfen würde, zB zwischen Sept. 2011 und Sept. 2012 zu unterscheiden.

Mein aktueller Schlüssel nur vom Typ Hash [Monat] (zB Hash [9] => für Monat September, kann ich alle entsprechenden Werte anzeigen). Wie kann ich einen eindeutigen Schlüssel des Typs Monat, Jahr erhalten, den ich problemlos durchschleifen kann, um alle Datensätze nach Monat und Jahr der Erstellung gruppiert anzuzeigen.

Danke

EDIT: -

Ich bin eine Art und Weise zu raten, dies zu tun, ist die Verwendung der created_at.to_date api, here Gebrauch zu machen. Ich frage mich nur, wie ich kann von created_at.to_date den Tag strippen, um einen einzigartige Kombination Schlüssel das könnte Arbeit mit der group_by Funktion Monat und Jahr.

+0

möglich Duplikat [MySQL Query GROUP BY Tag/Monat/Jahr] (http://stackoverflow.com/questions/508791/mysql-query-group-by-day-month- Jahr) – noodl

+0

Nein, nicht duplizieren. das q, auf das du dich beziehst, ist nur MYSQL-bezogen, wo dieses q ein rails + mysql ist. – Philip

Antwort

29

In SQL:

select * from messages group by year(created_at), month(created_at); 

In Rails:

Message.all.group_by { |m| m.created_at.beginning_of_month } 
+0

Danke dude .. :). Es funktioniert, wenn ich die WHERE-Klausel auch in die Abfrage eingeben .. Nur für Informationen aller .. – boddhisattva

0
Message.select("date_trunc('month', created_at) as month").group("month") 
Verwandte Themen