2017-08-16 68 views
3

使用填充了已注册选民的PG数据库。仅当搜索字符串不为空时,ActiveRecord(SQL)才会查询多列

试图设置它,所以我可以通过名字,姓氏,邮编或城市进行搜索。我希望能够找到符合所有输入参数的所有选民,但无法处理空的搜索字段。

where("zip LIKE ? OR city LIKE ? OR last_name LIKE ? OR first_name LIKE ?", 
"#{params[:zip]}","#{params[:city]}","#{params[:last_name]}","#{params[:first_name]}") 

有没有更好的方式来构建它,以便它匹配所有输入的参数,但忽略空字符串参数?现在,如果我输入名字和姓氏'约翰史密斯',我会得到'约翰琼斯'和'简史密斯'。

回答

3

这可以做的伎俩:

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) 

但是,如果没有拉链/城市/姓氏/ FIRST_NAME被赋予它应该返回的所有记录。

+0

谢谢,这将滤除从参数中进来的空串。我必须做的唯一的调整是加入的词应该是为了我的目的。可能在我原来的问题中没有清楚。 另外值得注意的是,ActiveRecord参数本身无法映射,它们必须通过强参数传递,然后to_h'params.permit(:something).to_h' –