ruby-on-rails - form_with - select rails helper
¿Agrupación por semana/mes/etc. y ActiveRecord? (7)
Aquí está la versión más refinada de este
@user.comments.group("year(created_at)").group("month(created_at)").count
Estoy haciendo algunos cálculos estáticos en mi producto. Un usuario ha realizado una serie de operaciones, digamos comentarios publicados. Quiero poder mostrarles cuántos comentarios publicaron por semana durante el último mes o por mes durante el año pasado.
¿Hay alguna manera con activerecord para agrupar de esta manera? ¿Es mi mejor esfuerzo simplemente hacer esto manualmente - para iterar sobre la suma de registros según mis propios criterios?
class User < ActiveRecord::Base
has_many :comments
end
class Comments < ActiveRecord::Base
belongs_to :user
end
@user.comments(:all).map {|c| ...do my calculations here...}
o hay alguna forma mejor?
¡Gracias! Oren
En Postgres puedes hacer:
@user.comments.group("DATE_TRUNC(''month'', created_at)").count
Llegar:
{"2012-08-01 00:00:00"=>152, "2012-07-01 00:00:00"=>57, "2012-09-01 00:00:00"=>132}
Acepta valores de "microsegundos" a "milenio" para la agrupación: http://www.postgresql.org/docs/8.1/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
En este caso, la mejor solución para mí fue hacerlo en SQL directo o usar la función Ruby group_by:
@user.all.group_by{ |u| u.created_at.beginning_of_month }
Mi suposición sería algo así como:
@user.comments.count(:group => "year(created_at),month(created_at)")
Código seco, mmm
Mira el plugin has_activity.
Mira la gema de la fecha del grupo
https://github.com/ankane/groupdate
tiene commits recientes, funciona con postgresql, se integra fácilmente con chart kick para gráficos rápidos, ¡y funciona con husos horarios!
Usar group_by
@user.comments.group_by(&:week)
class User < ActiveRecord::Base
def week
some_attribute_like_date.strftime(''%Y-%W'')
end
end
Esto le dará una lista agrupada en el formato de YYYY-WW