如何避免从此 Rails 控制器代码调用 .all?



如何避免从此代码调用.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

最新更新