有条件地在Ruby中复合SQL查询

时间:2018-07-23 17:23:46

标签: sql ruby if-statement conditional

我有几个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字符串组合到可以返回成功结果的内容中。

2 个答案:

答案 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

等...