仅当搜索字符串不为空时,ActiveRecord(SQL)才查询多列

仅当搜索字符串不为空时,ActiveRecord(SQL)才查询多列,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,使用一个由登记选民组成的PG数据库 尝试设置它,以便我可以按名字、姓氏、邮政编码或城市进行搜索。我希望能够找到匹配所有输入参数的所有投票者,但在处理空搜索字段时遇到困难 where("zip LIKE ? OR city LIKE ? OR last_name LIKE ? OR first_name LIKE ?", "#{params[:zip]}","#{params[:city]}","#{params[:last_name]}","#{params[:first_name]}")

使用一个由登记选民组成的PG数据库

尝试设置它,以便我可以按名字、姓氏、邮政编码或城市进行搜索。我希望能够找到匹配所有输入参数的所有投票者,但在处理空搜索字段时遇到困难

where("zip LIKE ? OR city LIKE ? OR last_name LIKE ? OR first_name LIKE ?",
 "#{params[:zip]}","#{params[:city]}","#{params[:last_name]}","#{params[:first_name]}")
是否有更好的方法来构建它,以便它匹配所有输入的参数,但忽略空字符串参数?现在,如果我输入名字和姓氏“约翰·史密斯”,我将得到“约翰·琼斯”和“简·史密斯”

这可以做到:

attrs_name_to_search = %w( zip city last_name first_name )
fitlered_params = params.slice(*attrs_name_to_search).select { |_,v| v.present? }
sql_cond = filtered_params.map { |k,_| "#{k} LIKE :#{k}" }.join(' OR ')
YourModel.where(sql_cond, filtered_params)

但是如果没有提供zip/city/last\u name/first\u name,它应该返回所有记录。

谢谢,这会过滤掉参数中的空字符串。我唯一需要做的调整是,为了我的目的,连接词应该是和。在我最初的问题中可能不清楚。另外值得注意的是,ActiveRecord参数本身是不可映射的,它们必须通过强参数传递,然后是to_h
params.permit(:something).to_h