目前我有以下类型的代码
scope :scope1, lambda{|param| where(param1: params)}
scope :scope2, lambda{|param| where(param2: params)}
在控制器中我会做
results = Model.some_other_scope
if !params[:param1].blank?
results = results.scope1(params[:param1])
end
if !params[:param2].blank?
results = results.scope2(params[:param2])
end
这不是很有效,因为它会对DB进行多次调用而不是一次。
有没有办法将这些范围链接起来,如果参数不存在就会被禁用?
results = Model.scope1(params[:param1]).scope2(params[:param2])
目前,链接不起作用因为where子句没有返回任何东西然后整个链断裂
答案 0 :(得分:2)
实际上,ActiveRecord
查询是懒惰地评估的,因此,简单地说,此代码只生成一个数据库调用。所以你的问题并不存在。