2017-08-16 69 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' –