gpt4 book ai didi

ruby-on-rails - 片段缓存和预加载 : How to get the best of both worlds?

转载 作者:行者123 更新时间:2023-12-02 23:12:27 24 4
gpt4 key购买 nike

在我看来,片段缓存和急切加载(至少有时)彼此有些矛盾。假设我有一个用户,他有很多帖子,每个帖子都有很多评论,而这些评论又可以有很多评论,依此类推。

当我必须渲染页面时,我可以选择立即加载用户、她的所有帖子、他们的所有评论等,以避免访问数据库 n-1 次。 或者我可以延迟加载每个对象,并依赖片段缓存来仅查询数据库中的新对象或已更改的对象。同时使用片段缓存和预加载似乎很浪费,因为我可能会执行非常复杂的查询并实例化大量对象,但仅使用其中的一小部分。

但是,如果我有一个应用程序,其中一个用户有许多 Foo,而这些 Foo 又有许多 Bar,依此类推,但其中每个 Foo 都是同时创建的,并包含其所有 Bar 及其关联对象,并且从那时起会怎么样?上永远不会改变。在这种情况下,我想对已渲染的 Foo 使用片段缓存,但在必须加载新的 Foo 及其所有关联对象时使用急切加载。毕竟,在更精细的级别上缓存片段没有任何好处。

Rails 中实现此目的的最佳方法是什么?我想我可以做一个查询来获取 Foo 的 id,然后在必须渲染每个 Foo 时通过急切加载进行显式查找。有没有更好/更优雅/更惯用的方法来做到这一点?

最佳答案

您可以在 Controller 中使用 fragment_exists? 方法来防止急切加载已经在缓存中的所有对象。只有第一次调用页面时才不会出现这种情况。

像这样:

  if fragment_exists? "my_cache_key_#{id}" 
# load your object without eager loading here
else
# eager load your objects here
end

然后在 View 中使用片段chaching:

<% cache("my_cache_key_#{@object.id}") do %>
...
...
...
<% end %>

这应该适合你!

关于ruby-on-rails - 片段缓存和预加载 : How to get the best of both worlds?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23180041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com