我有几个if语句可构建查询字符串和一组参数,例如:
search_string = ""
arguments = []
if params["this_data"] != nil
search_string << " AND this_data = ?"
arguments << params["this_data"]
end
if params["that_data"] != nil
search_string << " AND that_data = ?"
arguments << params["that_data"]
end
这一直持续到建立search_string
为止。现在,我正在尝试运行查询,并且没有太大的成功。我被困在下面的代码中,该代码返回语法错误:
Item.find_by_sql(["SELECT * FROM items WHERE thing IS NOT NULL ? ?", search_string, arguments])
我仍然坚持使用它,但是到目前为止,我不确定如何将这个SQL字符串组合到可以返回成功结果的内容中。
答案 0 :(得分:1)
以下是一些选项
scope = Item.where("thing IS NOT NULL") # rails 5 .where.not(thing: nil)
scope = scope.where(this_data: params["this_data"]) unless params["this_data"].nil?
scope = scope.where(that_data: params["that_data"]) unless params["that_data"].nil?
或
search_keys = ["this_data","that_data"]
Item.where("thing IS NOT NULL").where(params.select {|k,v| search_keys.include?(k) && !v.nil? })
这两个选项都将获得您要查找的结果,并将其与连接“ AND”并带有ActiveRecord
提供的所有SQL参数转义的
答案 1 :(得分:0)
我明白了。
我需要这样做:
search_string = Item.where("thing IS NOT NULL")
if params["this_data"] != nil
search_string = search_string.where("this_data = ?", params["this_data"])
end
if params["that_data"] != nil
search_string = search_string.where("that_data = ?", params["that_data"])
end
等...