最快的方式来过滤在铁轨上的红宝石收集

时间:2014-09-26 22:22:38

标签: ruby-on-rails ruby-on-rails-4

我有一个模型,我试图按多列过滤(有些可能不会出现在过滤器中),我正在尝试加快此查询。

以下是控制器索引方法的片段:

def index
    @things = Thing.accessible_by(current_ability)

    if params.has_key?(:color)
      @things = @things.where(:color => params[:color])
    end

    if params.has_key?(:weight)
      @things = @things.where(:weight => params[:weight])
    end

    if params.has_key?(:size)
      @things = @things.where(:size => params[:size])
    end

    @things = @things.order(:updated_at).page(params[:page]).per(params[:per_page])

end

我添加了这些索引:

add_index :things, :color
add_index :things, :weight
add_index :things, :size

试图找出最快的方法。还想将结果添加到通过传入的参数的串联键入的缓存中,这有意义添加吗?缓存只会帮助后续过滤器,而不是初始过滤器。

由于

1 个答案:

答案 0 :(得分:0)

这并不是关于加快查询速度,而是减少行动规模

def index
    filtered_params = params.select{|x| [:color, :weight, :size].include? x}
    @things = Thing.accessible_by(current_ability)
               .where(filtered_params)
               .order(:updated_at)
               .page(params[:page])
               .per(params[:per_page])
end

另外,您可能需要考虑缓存视图,如果您的视图不会发生这么大的改变,这将有所帮助。