如何避免从此代码调用.all
? 因为.all
将所有项目加载到内存中并且速度很慢
我试图将它们组合在一起,但代码并不是那么干燥
companies_controller.rb
def index
if params[:search].present?
@companies = Company.where("name ilike ?", "%#{params[:search]}%")
else
@companies = Company.all
end
if params[:page].present? && params[:per_page].present?
@companies = @companies.page(params[:page]).per(params[:per_page])
elsif params[:page].present?
@companies = @companies.page(params[:page])
else
@companies = @companies.page
end
end
这样的事情呢?
def index
scope = Company.all
scope = scope.where("name ilike ?", "%#{params[:search]}%") if params[:search].present?
scope = scope.per(params[:per_page]) if params[:per_page].present?
scope.page(params[:page])
end
注意:即使params[:page]
为空白,也可以安全地执行page(params[:page])
因为Kaminari能够在内部处理。
顺便说一句:all
不会将所有项目加载到内存中。它只返回一个可以返回所有记录的ActiveRecord::Relation
。但不会,因为您链接了更多范围(例如page
(以后。
假设你正在使用Kaminari,那么你只需要按照你在标题中所说的去做,并取下所有,Kaminari附带了你使用的类方法,所以你可以直接在类上调用它:
def index
if params[:search].present?
@companies = Company.where("name ilike ?", "%#{params[:search]}%")
else
@companies = Company
end
if params[:page].present? && params[:per_page].present?
@companies = @companies.page(params[:page]).per(params[:per_page])
elsif params[:page].present?
@companies = @companies.page(params[:page])
else
@companies = @companies.page
end
end