Active Record 查询以计算具有 HABTM 关联记录的视图的缓存键?
Active Record query to compute cache key for a view with HABTM associated records?
学生和家长有has_and_belongs_to_many
关系,都属于一个学校。
本次查询returns最新时间戳:
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" = [["school_id", 1]]
但第一个是唯一 returns 时间戳值。
我想使用第二种形式的原因是我希望能够做如下事情:
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>
计算具有关联的视图的缓存键。我目前正在使用执行冗余查询的低效数组键:
<% cache [batch_of_students, batch_of_students.includes(:parents).maximum("parents.updated_at")] do %>
你可以用 pluck 来做。
School.first.students.left_outer_joins(:parents).pluck("MAX(parents.updated_at)")
然后您可以使用
创建您的 cache_key
cache_key = School.first.students.left_outer_joins(:parents)
.pluck(%(
COUNT(students.*),
COUNT(parents.*),
MAX(students.updated_at),
MAX(parents.updated_at)))
其中 returns 具有这 4 个值的数组可以作为您的缓存键。
# [100, 100, 2015-08-24 02:14:07 UTC, 2015-08-24 02:14:07 UTC]
学生和家长有has_and_belongs_to_many
关系,都属于一个学校。
本次查询returns最新时间戳:
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" = [["school_id", 1]]
但第一个是唯一 returns 时间戳值。
我想使用第二种形式的原因是我希望能够做如下事情:
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>
计算具有关联的视图的缓存键。我目前正在使用执行冗余查询的低效数组键:
<% cache [batch_of_students, batch_of_students.includes(:parents).maximum("parents.updated_at")] do %>
你可以用 pluck 来做。
School.first.students.left_outer_joins(:parents).pluck("MAX(parents.updated_at)")
然后您可以使用
创建您的 cache_keycache_key = School.first.students.left_outer_joins(:parents)
.pluck(%(
COUNT(students.*),
COUNT(parents.*),
MAX(students.updated_at),
MAX(parents.updated_at)))
其中 returns 具有这 4 个值的数组可以作为您的缓存键。
# [100, 100, 2015-08-24 02:14:07 UTC, 2015-08-24 02:14:07 UTC]