我正在为我的应用程序实现一个活动源,就像facebook新闻源一样。每当用户执行某些操作(创建帖子,对帖子发表评论,创建相册,对照片发表评论)时,就会在“活动”表中创建一行,其中包含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秒钟,因此必须有更好的方法来处理这个问题。
答案 0 :(得分:1)
你有created_at
的索引吗?如果不这样做,那将会减慢你的速度--MySQL将不得不通读活动表中的每一行以确保它获得最新的五行(这适用于使用ORDER BY
子句的任何内容)。
还有一些建议,但这些都是次要的。可能会刮掉几毫秒,但没有大约三秒钟的时间:
:include => :user
可以做到这一点,或者有一种Rails 3风格的.include(...)
方法。a.whatever_type
选择要显示的内容?希望这有帮助!