2017-01-14 4 views
1

Étudiant et parent ont une relation has_and_belongs_to_many, les deux appartiennent à une école.Active Requête d'enregistrement pour calculer la clé de cache pour une vue avec des enregistrements associés à HABTM?

Cette requête renvoie la dernière estampille temporelle:

School.first.students.includes(:parents).maximum("parents.updated_at") 

Pourquoi pas:

School.first.students.left_outer_joins(:parents).select("MAX(parents.updated_at)") 

Le journal de la console implique que les deux exécuter la même SQL:

SELECT MAX(parents.updated_at) FROM "students" LEFT OUTER JOIN "parents_students" ON "parents_students"."student_id" = "students"."id" LEFT OUTER JOIN "parents" ON "parents"."id" = "parents_students"."parent_id" WHERE "students"."school_id" = $1 [["school_id", 1]] 

Mais le premier est le seul qui renvoie une valeur d'horodatage.

La raison pour laquelle je veux utiliser la 2ème forme est que je voudrais être en mesure de faire des choses comme:

School.first.students.left_outer_joins(:parents).select('COUNT(students.*) AS student_count, COUNT(parents.*) AS parent_count, MAX(students.updated_at) AS student_latest_update, MAX(parents.updated_at) AS parent_latest_update')`<br> 

pour calculer une clé de cache pour une vue avec les associations. J'utilise actuellement une clé de tableau inefficace qui effectue des requêtes redondantes:

<% cache [batch_of_students, batch_of_students.includes(:parents).maximum("parents.updated_at")] do %> 

Répondre

1

Vous pouvez le faire avec une plume.

School.first.students.left_outer_joins(:parents).pluck("MAX(parents.updated_at)") 

Vous pouvez ensuite créer votre cache_key avec

cache_key = School.first.students.left_outer_joins(:parents) 
    .pluck(%(
    COUNT(students.*), 
    COUNT(parents.*), 
    MAX(students.updated_at), 
    MAX(parents.updated_at))) 

qui retourne un tableau avec ces 4 valeurs qui peuvent agir comme la clé de cache.

# [100, 100, 2015-08-24 02:14:07 UTC, 2015-08-24 02:14:07 UTC] 
+1

Parfait. Je vous remercie!!! – rossinboulder