Ruby on rails 活动记录查询以计算具有HABTM关联记录的视图的缓存密钥?

Ruby on rails 活动记录查询以计算具有HABTM关联记录的视图的缓存密钥?,ruby-on-rails,caching,activerecord,fragment-caching,Ruby On Rails,Caching,Activerecord,Fragment Caching,学生和家长之间有一种关系,而且属于许多关系,都属于一所学校 此查询返回最新的时间戳: 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

学生和家长之间有一种
关系,而且属于许多
关系,都属于一所学校

此查询返回最新的时间戳:

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>
School.first.students.left\u outer\u join(:parents)。选择('COUNT(students.*)作为student\u COUNT,COUNT(parents.*)作为parent\u COUNT,MAX(students.updated\u at)作为student\u latest\u update,MAX(parents.updated\u at)作为parent\u latest\u update')`
为具有关联的视图计算缓存键。我目前使用的是一个执行冗余查询的低效数组密钥:

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

你可以用拨拉来完成

School.first.students.left_outer_joins(:parents).pluck("MAX(parents.updated_at)")
然后,您可以使用创建缓存密钥

cache_key = School.first.students.left_outer_joins(:parents)
  .pluck(%(
    COUNT(students.*),
    COUNT(parents.*), 
    MAX(students.updated_at), 
    MAX(parents.updated_at)))
它返回一个数组,其中包含可以用作缓存键的4个值

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