J'ai des modèles User
et Gift
. Un utilisateur peut envoyer des cadeaux à d'autres utilisateurs. J'ai une table relationnelle qui me dit quels utilisateurs ont reçu un cadeau. D'un autre côté, un utilisateur appartient à un School
, qui peut être gratuit ou payant.Rendre cette requête ActiveRecord plus efficace?
Je veux connaître le nombre d'utilisateurs qui ont reçu un cadeau la semaine dernière pour un type d'école spécifique (ceci est gratuit ou payant).
je peux faire:
Gift.joins(:schools).where("created_at >= ? AND schools.free_school = ?", Time.now.beggining_of_week, true).collect(&:gift_recipients).flatten.uniq.count.
Ou, je veux savoir combien d'utilisateurs ont envoyé des cadeaux de la dernière semaine. Cela fonctionne:
Gift.joins(:schools).where("created_at >= ? AND schools.free_school = ?", Time.now.beggining_of_week, true).collect(&:user_id).uniq.count.
Si je veux savoir combien d'utilisateurs ont envoyé ou reçu un cadeau la semaine dernière que je peux faire:
(Gift.joins(:schools).where("created_at >= ? AND schools.free_school = ?", Time.now.beggining_of_week, true).collect(&:gift_recipients).flatten + Gift.joins(:schools).where("created_at >= ? AND schools.free_school = ?", Time.now.beggining_of_week, true).collect(&:user_id)).uniq.count
Tout cela fonctionne très bien, mais si la base de données est assez grand C'est vraiment lent. Avez-vous des suggestions pour le rendre plus efficace, peut-être en utilisant du SQL brut si nécessaire?
"gifts"
user_id (integer)
school_id (integer)
created_at (datetime)
updated_at (datetime)
"gift_recipients" is a table like
gift_id | recipient_id,
Veuillez publier le/les modèles de l'utilisateur, du cadeau et de l'école. – Winfield