【问题标题】:ActiveRecord (SQL) query multiple columns only if search string not emptyActiveRecord (SQL) 仅在搜索字符串不为空时才查询多列
【发布时间】:2017-08-16 18:31:13
【问题描述】:

使用填满已登记选民的 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]}")

有没有更好的方法来构建它以匹配所有输入的参数,但忽略空字符串参数?现在,如果我输入名字和姓氏“John Smith”,我将得到“John Jones”和“Jane Smith”。

【问题讨论】:

    标签: sql ruby-on-rails activerecord


    【解决方案1】:

    这可以解决问题:

    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_name/first_name,它应该返回所有记录。

    【讨论】:

    • 谢谢,这会过滤掉来自参数的空字符串。我必须做的唯一调整是为了我的目的,加入词应该是 AND。在我原来的问题中可能不清楚。另外值得注意的是 ActiveRecord 参数本身不可映射,它们必须通过强参数传递,然后是 to_h params.permit(:something).to_h
    猜你喜欢
    • 2016-05-10
    • 2017-07-13
    • 2021-08-26
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多