【问题标题】:Active Record query to compute cache key for a view with HABTM associated records?Active Record 查询以计算具有 HABTM 关联记录的视图的缓存键?
【发布时间】:2017-05-29 21:29:01
【问题描述】:

Student 和 Parent 有 has_and_belongs_to_many 关系,都属于 School。

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

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>

为具有关联的视图计算缓存键。我目前正在使用执行冗余查询的低效数组键:

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

【问题讨论】:

    标签: ruby-on-rails caching activerecord fragment-caching


    【解决方案1】:

    你可以做到这一点。

    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)))
    

    它返回一个包含这 4 个值的数组,这些值可以作为您的缓存键。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多