Rails框架下SQL无搜索参数时如何跳过执行搜索操作?
解决方法
你可以通过两种方式实现参数为空时跳过搜索:
方式1:改造scope内部逻辑,自动判断参数有效性
在scope开头增加参数校验,如果参数为空直接返回当前查询链(相当于跳过当前scope的筛选条件):
# item.rb scope :name_and_id_search_in_items_or_masters, -> (search_name, search_id) { # 两个参数都有有效值时才执行搜索,否则直接返回all不追加条件 if search_name.present? && search_id.present? where(ActiveRecord::Base.sanitize_sql_array([ " ( items.status != 1 AND items.name LIKE :asset_name AND items_industries.id = :industry_id OR items.status = 1 AND masters.name LIKE :asset_name AND masters_industries.id = :industry_id ) ", { asset_name: "%#{search_name}%", industry_id: search_id } ])) else all end }
注:上面给原有SQL的OR逻辑两端加了括号,避免和其他全局where条件拼接时出现逻辑优先级错误。
方式2:控制器层面判断,参数有效才调用scope
不需要修改原有scope,在控制器调用前加判断即可,逻辑更直观:
# items_controller.rb if index_search_params[:search_name].present? && index_search_params[:search_id].present? @items = @items.name_and_id_search_in_items_or_masters(index_search_params[:search_name], index_search_params[:search_id]) end
补充说明
如果你的业务逻辑是只要其中一个参数存在就触发对应搜索,可以调整判断条件,比如把&&改成||,同时对应调整SQL的查询逻辑即可。
内容的提问来源于stack exchange,提问作者katahik
相关产品推荐
相关产品推荐

