关注.rb
belongs_to :show
def cached_show
Rails.cache.fetch([self, :show]) do
show
end
end
看法:
<% @recently_favorited.each do |following| %>
<li>
<%= link_to "#{following.cached_show.name}", show_path(:permalink => following.cached_show.permalink) %> <span><%= "(#{pluralize(following.cached_show.followers, "follower")})" %></span>
</li>
<% end %>
控制台中的结果:
Cache read: followings/632770-20120929132253/show
Cache generate: followings/632770-20120929132253/show
Show Load (0.7ms) SELECT `shows`.* FROM `shows`WHERE `shows`.`id` = 617 LIMIT 1
Cache write: followings/632770-20120929132253/show
Cache read: followings/632770-20120929132253/show
Cache fetch_hit: followings/632770-20120929132253/show
Cache read: followings/632770-20120929132253/show
Cache fetch_hit: followings/632770-20120929132253/show
问题:
这甚至是获取/缓存关联的“正确”实现吗?
那么性能呢?
在某些视图中(如示例中),它会在每个循环中命中缓存 3 次。在我的情况下,我在页脚中循环了 10 个项目,因此每个请求都会命中 30 次。这很好,还是每个循环一个 n+1 查询会更好?
建议和一般最佳实践表示赞赏:)