2012-09-21 46 views
10

Estoy en Ruby 1.9.2, Rails 3.0.x y uso MySQL DB. Tengo un Modelo de mensajes, donde uno puede publicar mensajes nuevos todos los días.Registros grupales por mes y año en Rails

Tengo una acción de índice en la que quiero mostrar estos mensajes agrupados por mes y año. Esto básicamente se usa para filtrar mensajes.

Mi consulta es el siguiente: -

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

que utiliza la función group_by en Rails, después de referirse a this post

Mi consulta GROUP BY es: -

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

estaba devolvió un hash llamado @msgs_by_month. Esto me ayudó a agrupar los mensajes por mes, pero tengo que tener en cuenta el año, para formar una clave única, ya que me ayudaría a diferenciar entre por ejemplo, sep 2011 y Sept 2012.

Mi clave actual solo es de tipo Hash [Month] (ej. Hash [9] => para el mes de septiembre, puedo mostrar todos los valores apropiados). ¿Cómo puedo obtener una clave única de tipo mes, año en el que puedo hacer un bucle fácilmente para mostrar todos los registros agrupados por mes y año de creación?

Gracias

EDITAR: -

supongo una manera de hacer esto, es hacer uso de la API created_at.to_date, siempre here . Yo sólo pregunto, cómo puedo despojar a cabo el día decreated_at.to_date para obtener una única mes y año combinación de teclas que podría trabajo con la función group_by.

+0

posible duplicado del [grupo de consultas MySQL a día/mes/año] (http://stackoverflow.com/questions/508791/mysql-query-group-by-day-month- año) – noodl

+0

Nah, no duplicado. el q al que te refieres solo está relacionado con MYSQL donde q este es un rails + mysql .. – Philip

Respuesta

29

En SQL:

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

En Rails:

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

Gracias amigo ... :). Funciona cuando introduzco la cláusula where en la consulta. Solo para obtener información de todos .. – boddhisattva

0
Message.select("date_trunc('month', created_at) as month").group("month") 
Cuestiones relacionadas