在 Ruby 中有条件地复合 SQL 查询
conditionally compounding an SQL query in Ruby
我有几个构建查询字符串和一组参数的 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 字符串组合成 returns 成功的结果。
AAAGH 我想通了。
我需要这样做:
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
等...
这里有几个选项
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" 连接在一起,所有 SQL 参数转义 ActiveRecord
提供
我有几个构建查询字符串和一组参数的 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 字符串组合成 returns 成功的结果。
AAAGH 我想通了。
我需要这样做:
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
等...
这里有几个选项
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" 连接在一起,所有 SQL 参数转义 ActiveRecord
提供