2013-07-19 44 views
0

所以我正在开发一个Rails应用程序,并且我正在分页提要。当我这样做时,我想知道我是否正确地做了这件事,因为我的加载时间超过了1500毫秒。我的代码是:分页最佳实践红宝石

stories = Story.feed 
@stories = Kaminari.paginate_array(stories).page(params[:page]).per(params[:pageSize]) 

我有这几个问题:

  1. 我应该分页Story.feed,或者是有某种方法 的,仅返回一些我需要的故事?
  2. 这个负载时间正常吗?
  3. 有什么其他的事情,我可以做优化这个

(另外,Story.feed返回故事对象的数组,该代码是在这里:

def self.feed 
    rawStories = Story.includes([:likes, :viewers, :user, :storyblocks]).all 
    newFeaturedStories = rawStories.where(:featured => true).where(:updated_at.gte => (Date.today - 3)).desc(:created_at).entries 
    normalStories = rawStories.not_in(:featured => true, :or => [:updated_at.gte => (Date.today - 3)]).desc(:created_at).entries 
    newFeaturedStories.entries.concat(normalStories.entries) 
    end 

我使用mongoid和MongoDB

回答

0

我认为将分页会帮助你在这里 - >mislav/will_paginate 从那里,你可以简单地给你的控制器动作.per_page(20),例如后20个对象(可以定义objec TS,见维基)会有分页

0

我怀疑,当你在一个叫ActiveRecord::RelationKaminari.paginate_array,它会导致整个结果集从DB获取和类似呼吁Model.all.to_a加载到内存中。

为了避免这种情况,我首先找到一种方法将Story.feed变成一个范围,而不是一个类方法。表面上他们看起来是一样的 - 差异很微妙但很深。见Active Record scopes vs class methods

接下来,沟paginate_array有利于连锁Kaminari的page()per()示波器。

例如(您的简化版本):

class Article < ActiveRecord::Base 

    scope :featured, -> { where(featured: true) } 
    scope :last_3_days, -> { 
    where(:updated_at.gte => (Date.today - 3)).desc(:created_at) 
    } 
    scope :feed, -> { featured.last_3_days } 

然后通过去分页简单地:

Article.feed.per(page_size).page(page) 

这样做的最大好处是,雷能链到生成的SQL插入合适的LIMITOFFSET子句,从而减少返回的结果集的大小,只返回需要显示的内容,而不是返回每个匹配的记录。

+0

这只会返回过去3天的精选故事。我需要的功能是让顶级故事成为精选故事,而不考虑日期,然后在下面按照created_at排序的故事的其余部分日期 –

+0

就像我说的那样,它是您的简化版本。关键是使用'per()。page()'而不是'concat'和'paginate_array'(获取每个匹配的记录)。你必须是一个重写你的整个复合查询作为范围(我只是假设它是可能的,我可能是错的)。 –

0

问题是,您从数组中获取所有来自数据源的提要,这需要很长时间。

我建议你使用any_of查询from this great gem

从那里,这样做:

def self.feed_stories 
    newFeaturedStories = Story.where(:featured => true).where(:updated_at.gte => (Date.today - 3.days)) 
    normalStories  = Story.not_in(:featured => true, :or => [:updated_at.gte => (Date.today - 3.days)]) 
    Story.includes([:likes, :viewers, :user, :storyblocks]).any_of(newFeaturedStories, normalStories).desc(:created_at) 
end 

然后这个分页:

selected_stories = Story.feed_stories.per(page_size).page(page) 

真的不明白你有什么entries,但在这一刻得到他们。

总结:想出一个独特的分页数据库查询。

+0

我得到这个错误'''未定义的方法'注入'为#<故事:0x007faf703682e8>''' –