在我看来,片段缓存和急切加载——至少有时——有些矛盾。假设我有一个用户,他有很多帖子,每个帖子都有很多评论,而这些评论又可以有很多评论等等。
当我必须渲染页面时,我可以选择预先加载用户、她的所有帖子、他们的所有评论等,以避免访问数据库 n-1 次。或者我可以懒惰地加载每个对象并依靠片段缓存来仅查询数据库中的新对象或已更改的对象。同时使用片段缓存和急切加载似乎很浪费,因为我可能会执行非常复杂的查询并实例化大量对象而只使用其中的一小部分。
但是,如果我有一个应用程序,其中用户有许多 Foo,而这些 Foo 又具有许多 Bars 等等,但其中每个 Foo 同时创建完整的所有 Bars 及其关联对象,从那时起永远不会改变. 在这种情况下,我想对已经渲染的 Foo 使用片段缓存,但是当我必须加载一个新的 Foo 及其所有关联对象时使用急切加载。毕竟,在更细粒度的级别缓存片段并没有什么好处。
Rails 中实现此目的的最佳方法是什么?我想我可以做一个查询来只获取 Foo 的 id,然后在我必须渲染每个 Foo 时使用急切加载进行显式查找。有没有更好/更优雅/更惯用的方式来做到这一点?