Jbuilder 部分缓存未添加到输出中

Posted

技术标签:

【中文标题】Jbuilder 部分缓存未添加到输出中【英文标题】:Jbuilder Partial Cache not added to output 【发布时间】:2020-05-19 14:29:34 【问题描述】:

我正在运行一项任务,以使用 jbuilder 为大型 json 输出构建缓存。缓存正在填充,我可以通过 puts 将其输出到日志中,但是如何将其添加到主 jbuilder 模板返回的 json 文件中?

我正在像这样预热我的缓存:

task update_cache: :environment do
  @jobs = Job.where(archived: false).where(assignee_id: 262).each do |job|
    puts "job: #job.id"
    job.workspans.each do |workspan|
      json = ApplicationController.new.render_to_string(
        template: 'api/jobs/_workspan',
        locals:  :workspan => workspan 
      )      
      Rails.cache.write("workspan-#workspan.id", json)
    end
  end
end

然后像这样获取它

json.jobs @jobs do |job|
  json.job  do
    json.(job, *Job.column_names)
    json.circuit  json.(job.circuit, *Circuit.column_names) 
    json.workspans(job.ordered_workspans) do |workspan|                    
      Rails.cache.fetch("workspan-#workspan.id") do
        render json.partial! 'workspan', workspan: workspan
      end
    end
  end
end

workspans 节点错误地返回为 []

【问题讨论】:

【参考方案1】:

任务中需要进行两次更改,保存为 json,而不是字符串并更改缓存键

Rails.cache.write("jbuilder/views/workspan-#workspan.id", JSON.parse(json_string))

然后允许 jBuidler 模板获取缓存的 json 并将其包含在正常的 jbuilder 名称中。没有摘要的注释。

json.cache! "workspan-#workspan.id",  skip_digest: true do
   json.partial! 'workspan', workspan: workspan
end

【讨论】:

以上是关于Jbuilder 部分缓存未添加到输出中的主要内容,如果未能解决你的问题,请参考以下文章

Rails jbuilder DateTime将小数添加到秒

任务输出缓存已启用,但未配置或启用构建缓存

JBuilder中未定义的局部变量或方法“json”

在 JSON JBuilder 中渲染 html 部分

如何在 jbuilder 中将一个部分渲染两次?

Rails 缓存分页集合