2017-01-14 10 views
1

生徒と親はhas_and_belongs_to_manyの関係を持ち、どちらも学校に属します。HABTM関連レコードを持つビューのキャッシュキーを計算するアクティブレコードクエリ?

このクエリは、最新のタイムスタンプを返します。

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

しないのはなぜこの:

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

コンソールログは、同じ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]] 

をしかし、最初のものはタイムスタンプ値を返す唯一のものです。協会とビュー用のキャッシュキーを計算するために

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> 

:私は2番目のフォームを使用したい

理由は、私はのようなものを行うことができるようにしたいと思いということです。私は現在、冗長クエリを実行する非効率な配列キーを使用しています:

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

答えて

1

あなたはそれを行うことができます。

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

次に、あなたのキャッシュキーとして機能することができ、これらの4つの値を持つ配列を返します

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

であなたのcache_keyを作成することができます。

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

パーフェクト。ありがとうございました!!! – rossinboulder

関連する問題