为类方法缓存结果集?

时间:2017-03-01 10:53:21

标签: ruby-on-rails caching rspec

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

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

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

还有其他方法来缓存这样的东西吗?

1 个答案:

答案 0 :(得分:1)

直接在fetch method

中使用缓存
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