1

我的 rails4 应用程序中的帖子具有以下结构。用户可以对帖子发表评论,并且可以在评论中写下回复。我想在页面上使用带有自动过期键的俄罗斯娃娃缓存,但我不知道在这种情况下我应该怎么做。

sby 能告诉我在这种情况下如何使用它吗?

楷模:

#post.rb

belongs_to :user
has_many :post_comments, dependent: :destroy

#post_comments.rb

belongs_to :user
belongs_to :post
has_many :post_comment_replies, dependent: :destroy

#post_comment_replies.rb

belongs_to :user
belongs_to :post_comments

帖子/index.html.erb

 <div class="post-index new-post-insert">
   <%= render @posts %>
 </div>

_post.html.erb

<%= post.body %>
<%= post.user.full_name %>
....
<%= render partial: 'posts/post_comments/post_comment', collection: post.post_comments.ordered.included, as: :post_comment, locals: {post: post} %>

_post_comment.html.erb

<%= post_comment.body %>
<%= post_comment.user.full_name %>
......
<%= render partial: 'posts/post_comment_replies/post_comment_reply', collection: post_comment.post_comment_replies.ordered.included, as: :post_comment_reply, locals: { post_comment: post_comment } %>

_post_comment_reply.html.erb

<%= post_comment_reply.user.full_name %>
<%= post_comment_reply.body %>
4

1 回答 1

1

你需要做几件事

belongs_to为您的关系增添触感

的子孙Post需要接触他们的父母,以便updated_at列更新,这反过来又使缓存键无效。

#post_comments.rb

belongs_to :user
belongs_to :post, touch: true
has_many :post_comment_replies, dependent: :destroy

#post_comment_replies.rb

belongs_to :user
belongs_to :post_comments, touch: true

cache命令添加到您的视图中

帖子/index.html.erb

在帖子的主列表中,我们希望缓存最新updated_at的帖子和updated_at相应用户的最新。

 <div class="post-index new-post-insert">
    <% cache ["posts", @posts.maximum(:updated_at).to_i, @posts.map {|p| p.user.try(:updated_at).to_i}.max] %>
     <%= render @posts %>
    <% end %>
 </div>

_post.html.erb

<% cache ["postlist", post, post.user] %>
  <%= post.body %>
  <%= post.user.full_name %>
  ....
  <%= render partial: 'posts/post_comments/post_comment', collection: post.post_comments.ordered.included, as: :post_comment, locals: {post: post} %>
<% end %>

_post_comment.html.erb

<% cache ["postcommentlist", post_comment, post_comment.user] %>
  <%= post_comment.body %>
  <%= post_comment.user.full_name %>
  ......
  <%= render partial: 'posts/post_comment_replies/post_comment_reply', collection: post_comment.post_comment_replies.ordered.included, as: :post_comment_reply, locals: { post_comment: post_comment } %>
<% end %>

_post_comment_reply.html.erb

<% cache ["postcommentreplylist", post_comment_reply, post_comment_reply.user] %>
  <%= post_comment_reply.user.full_name %>
  <%= post_comment_reply.body %>
<% end %>

这可以通过cached: truerender partial函数中使用来改进。但是,由于我们希望在用户更改其用户名时使缓存过期,所以它变得有点棘手。

如果您覆盖所有模型cache_key功能,则可以这样做。

为什么要使用cached: truein render partial

我们可以做的不是在每个部分内部调用cache(就像我们上面做的那样)

<%= render partial: 'posts/post_comments/post_comment', collection: post.post_comments, cached: true %>

如果我们只需要缓存在 post_comment´s 上updated_at

两者的区别在于,当我们在部分getRails中缓存时,每个对象都会向缓存存储(例如 memcache)发出一次命令。因此,如果您有 50 个 postcomments,将有 50 个单独的请求对 memcached 进行检索。

但是如果我们在调用中使用cached: truerender , Rails 将向 memcached 发出multi_get请求,并在一个请求中检索所有 50 个对象。从而提高页面加载时间。在我们在生产环境中进行的测试中。它将页面加载时间减少了约 50 毫秒 - 约 200 毫秒,具体取决于数据量。

于 2016-03-31T18:13:58.487 回答