缓存类方法的结果集?

约书亚·穆海姆(Joshua Muheim)

我的一个模型中有一个非常依赖数据库的类方法:

class Page < ApplicationRecord
  def self.collection_tree
    pages = []
    walk_tree do |page, level|
      pages << page
    end
    pages
  end
end

我想缓存结果,因此只有对方法的第一次调用才会调用数据库查询。

我这样尝试过:

def self.collection_tree
  return @collection_tree if @collection_tree

  @collection_tree = []
  walk_tree do |page, level|
    @collection_tree << page
  end
  @collection_tree
end

但这导致规格随机失败 - 似乎这并没有像我预期的那样在规格之间重置。

有没有另一种方法来缓存这样的东西?

眼花缭乱

通过提取方法直接使用缓存

def self.collection_tree
  Rails.cache.fetch('collection_tree') do    
    collection_tree = []
    walk_tree do |page, level|
      collection_tree << page
    end
    collection_tree
  end
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JDBC - 结果集缓存管理

来自分类Dev

如何基于返回布尔值的模型类上方法的结果来过滤查询集?

来自分类Dev

从Facebook缓存Open Graph结果的最佳方法?

来自分类Dev

缓存所有方法的结果

来自分类Dev

Ruby是否缓存将评估为相同结果的方法的结果?

来自分类Dev

如何在类中缓存查询结果,然后根据在 C# 中的方法中传递的参数重新使用它进行搜索?

来自分类Dev

在lodash.js中,是否会缓存`.value()`方法的结果?

来自分类Dev

在MATLAB中缓存函数结果的最简洁方法

来自分类Dev

从ASP.NET中的异步方法缓存结果

来自分类Dev

如果不抛出[n async]工厂方法,则缓存结果

来自分类Dev

从ASP.NET中的异步方法缓存结果

来自分类Dev

使用Println显示超类方法的结果

来自分类Dev

使用Println显示超类方法的结果

来自分类Dev

“查找用法”显示类方法的错误结果

来自分类Dev

请求-承诺:缓存结果

来自分类Dev

RxJava缓存中间结果

来自分类Dev

Django的查询结果缓存

来自分类Dev

缓存SHOUTcast API结果

来自分类Dev

功能的缓存结果

来自分类Dev

雪花结果缓存

来自分类Dev

如何“缓存”耗时的结果?

来自分类Dev

RxJava缓存中间结果

来自分类Dev

BackboneJS缓存http结果

来自分类Dev

功能的缓存结果

来自分类Dev

在AJAX中缓存的结果

来自分类Dev

如何合并不同聚类方法的聚类结果?

来自分类Dev

缓存大小和计算缓存集

来自分类Dev

刷新Proguard类缓存

来自分类Dev

InterSystems缓存类导出