我已经多次遇到这个问题:我想在查询上应用范围,但前提是传递给范围的参数不为空。所以
tags = Tag.where(name: params[:name]) if params[:name]
但是,这样做有两个问题。一种是 Rails 会立即评估查询,所以如果我想对它应用更多条件,比如说
tags.where(location: params[:place]) if params[:place]
它将再次查询数据库。第二个问题是它看起来不太好,我试图用类方法来解决这个问题。
class Tag < ActiveRecord::Base
def self.name_like this_name
if !this_name.blank?
where("name ILIKE '%#{this_name}%'")
else
#what do I put here? `all` does not work
end
end
end
但是,我不能简单地放在all
那里,因为它会评估一个查询。有什么想法吗?