Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在没有多个后续查询的情况下设置集合缓存键_Ruby On Rails_Caching - Fatal编程技术网

Ruby on rails 在没有多个后续查询的情况下设置集合缓存键

Ruby on rails 在没有多个后续查询的情况下设置集合缓存键,ruby-on-rails,caching,Ruby On Rails,Caching,我刚开始为我的应用程序缓存,有点卡住了。我有一个依赖于作用域的查询。范围收集在页面上创建的最后(x)篇文章 Rails.cache.fetch('homepage/posts') do posts = Post.by_latest render json: posts end 这是我很难理解的。因为我想确保网站显示最新的帖子,所以我不想手动设置过期时间或日期。相反,我希望在创建或销毁新帖子时使缓存过期。这是另一个困境。我曾想过在我的Post模型中进行回调,但当我想使其他键的缓存过期,

我刚开始为我的应用程序缓存,有点卡住了。我有一个依赖于作用域的查询。范围收集在页面上创建的最后(x)篇文章

Rails.cache.fetch('homepage/posts') do
  posts = Post.by_latest

  render json: posts
end
这是我很难理解的。因为我想确保网站显示最新的帖子,所以我不想手动设置过期时间或日期。相反,我希望在创建或销毁新帖子时使缓存过期。这是另一个困境。我曾想过在我的Post模型中进行回调,但当我想使其他键的缓存过期,但所有键都想完成相同的事情时,事情变得有点混乱

def flush_cache
  Rails.cache.delete('homepage/posts')
  Rails.cache.delete('posts')
  ...
end
我想以更动态的方式刷新缓存,就像使用单个对象一样…其中缓存键由对象的
updated_at
属性组成,并在每次修改时过期。但我发现收藏很难做到这一点。从查询生成缓存键将导致查询本身,从而破坏缓存的总体目的:

Rails.cache.fetch(Post.by_latest.cache_key) do
  posts = Post.by_latest

  render json: posts
end

任何帮助都将不胜感激

我认为您使用它的方式不太正确,Rails可以很好地自动处理集合的缓存

这是缓存集合的标准设置

posts = Rails.cache.fetch(Post.by_latest) do
  Post.by_latest
end

render json: posts

明白了。谢谢我在实验中注意到一件事。我在查询中添加了一个
limit
,每次请求都会触发一个db查询。你知道为什么会这样吗?这是一个查询:
(11.4ms)选择COUNT(*)作为“size”,MAX(用于缓存键的subquery\u.updated\u at)作为时间戳从(选择“albums”。“updated\u at”从“albums”按“albums”排序。“release\u date”DESC LIMIT$1)子查询\u用于缓存键[[“LIMIT”,24]]
@CarlEdwards您看到的这个查询是Rails检查是否需要更新缓存,它基本上是检查集合中最新的
updated\u时间戳,以查看是否有新的或更新的记录。