web-dev-qa-db-fra.com

Regroupement par semaine / mois / etc & Activerecord?

Je fais des calculs statiques dans mon produit. Un utilisateur a effectué un certain nombre d'opérations, disons-lui des commentaires postés. Je veux pouvoir leur montrer combien de commentaires qu'ils ont affichés par semaine au cours du mois dernier, ou par mois pour l'année écoulée.

Y a-t-il un moyen avec Activerecord de regrouper de cette façon? Mon meilleur est mon mieux pour simplement faire cela manuellement - à itérer sur les documents des enregistrements en fonction de mes propres critères?

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...}

ou y a-t-il un meilleur moyen?

merci! Orien

36
teich

Dans ce cas, la meilleure solution pour moi était de le faire en SQL droit, ou d'utiliser le Ruby Fonction:

@user.all.group_by{ |u| u.created_at.beginning_of_month }
31
teich

À Postgres, vous pouvez faire:

@user.comments.group("DATE_TRUNC('month', created_at)").count

obtenir:

{"2012-08-01 00:00:00"=>152, "2012-07-01 00:00:00"=>57, "2012-09-01 00:00:00"=>132}

Il accepte les valeurs de "microsecondes" à "Millennium" pour le groupement: http://www.postgresql.org/docs/8.1/static/fonctions-DateTime.html#fonctions-DateTime-Trunc

82
Wojtek Kruszewski

Voici la version plus raffinée de cette

@user.comments.group("year(created_at)").group("month(created_at)").count
23
Ahmad Hussain

Utiliser group_by

@user.comments.group_by(&:week)

class User < ActiveRecord::Base
  def week
    some_attribute_like_date.strftime('%Y-%W')
  end
end

Cela vous donnera une liste groupée dans le format de yyyy-ww

3
Austio

Découvrez le GEM Date du groupe

https://github.com/ankane/groupdate

il a récemment des commits, fonctionne avec PostgreSQL, s'intègre facilement à un coup de pied de graphique pour la cartographie rapide et fonctionne avec des fuseaux horaires !!

2
Pavan Katepalli

Découvrez le plug-in has_activity.

2
Jim Gilliam