【发布时间】:2011-03-29 09:57:39
【问题描述】:
我正在为我的应用程序实现一个活动提要,就像 facebook 新闻提要一样。每当用户执行某项操作(创建帖子、对帖子进行 cmets、创建相册、对照片进行 cmets)时,都会在活动表中创建一行,其中包含 user_id、类别和数据。数据是一个序列化的散列,对于每种类型的活动都是不同的(帖子包含帖子标题和帖子 ID,照片评论包含其他内容等)。然后视图循环遍历所有活动并根据活动类别打印一些内容。很简单,而且很有效。问题是它超级慢,所以我一定做错了什么。代码如下:
#activity.rb snippet
def post?
category == "post"
end
def post_comment?
category == "post_comment"
end
def album?
category == "album"
end
def photo_comment?
category == "photo_comment"
end
#controller snippet
@Activity = Activity.all(:order=> 'created_at DESC', :limit=>"5")
#view snippet
<% @Activity.each do |a| %>
<div class="activity_item">
<div class="avatar" style="background-image: url(<%= small_pic_url(a.user)%>) "></div>
<div class="text"> <%= a.user.username %>
<% if a.post? %>
posted <%= link_to a.data["post_title"], post_path(a.data["post_id"]) %>
<% elsif a.post_comment? %>
commented on <%= link_to a.data["post_title"], post_path(a.data["post_id"]) %>
<% elsif a.album? %>
created a <%= link_to "Photo Album", album_path(a.data["album_id"])%>
<% elsif a.photo_comment? %>
commented on <%= link_to "#{a.data["username"]}'s photo", upload_path(a.data["photo_id"])%>
<% end %>
</div>
</div>
<% end %>
我在活动表上添加了一个 user_id 索引,但这似乎没有多大作用。渲染 5 个活动项目/头像需要 3 秒以上,因此必须有更好的方法来处理。
【问题讨论】:
标签: mysql ruby-on-rails database optimization