我有一个模型,我试图按多列过滤(有些可能不会出现在过滤器中),我正在尝试加快此查询。
以下是控制器索引方法的片段:
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
试图找出最快的方法。还想将结果添加到通过传入的参数的串联键入的缓存中,这有意义添加吗?缓存只会帮助后续过滤器,而不是初始过滤器。
由于
答案 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
另外,您可能需要考虑缓存视图,如果您的视图不会发生这么大的改变,这将有所帮助。