2 votes

Regrouper et compter les modèles associés par created_at

J'ai un Variant modèle qui possède plusieurs PageViews y Clicks . Je voudrais retourner un tableau d'objets qui ressemble à ceci :

[
  { day: 'Thu, 19 Sep 2019', page_views: 10, clicks: 2, rate: 0.2  },
  { day: 'Wed, 18 Sep 2019', page_views: 110, clicks: 32, rate: 0.29  },
  { day: 'Tue, 17 Sep 2019', page_views: 113, clicks: 19, rate: 0.17 },
  ... etc ...
]

Regroupés par le jour où ils ont été créés, puis un décompte de chaque modèle créé à cette date. rate est le taux de clics, juste le nombre de clicks / nombre de page_view .

Idéalement, je ferais tout cela en sql. Si c'est plus simple de ne pas faire le rate calcul en SQL, je peux le faire en Rails.

Utilisation de la mise à jour du groupe La gemme pourrait fonctionner ici mais je pense qu'elle renvoie dans un format différent et je ne comprends pas bien comment la personnaliser pour qu'elle renvoie le format que j'ai décrit ici.

1voto

Sebastian Palma Points 15219

Je n'ai pas réussi à obtenir quelque chose de concret en utilisant AR. Voici une version de PostgreSQL qui pourrait fonctionner :

SELECT v.date,
  (SELECT COUNT(*) FROM clicks     WHERE date(created_at) = v.date) AS clicks,
  (SELECT COUNT(*) FROM page_views WHERE date(created_at) = v.date) AS page_views
FROM (SELECT date(created_at) AS DATE FROM variants GROUP BY date) v

Il est intéressant de noter que cela renvoie la même requête SQL, mais se plaint de l'ordre ou renvoie les alias comme des tableaux vides :

Variant
  .select(
    'v.date,
    (SELECT COUNT(*) FROM clicks     WHERE date(created_at) = v.date) AS clicks,
    (SELECT COUNT(*) FROM page_views WHERE date(created_at) = v.date) AS page_views'
  )
  .from(
    Variant.select('date(created_at) AS date').group(:date),
    :v
  )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X