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
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 }
À 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
Voici la version plus raffinée de cette
@user.comments.group("year(created_at)").group("month(created_at)").count
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
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 !!
Découvrez le plug-in has_activity.