使用LIKE对未知(动态)查询数进行SQL查询

时间:2016-10-27 14:40:27

标签: mysql ruby-on-rails ruby sql-like

我有一个执行动态查询的Rails搜索表单。也就是说,用户输入如下搜索:

(hobby="skiing") OR (gender="male" AND hobby="jogging") 

所以,我不知道在运行之前我会搜索多少个查询。

我通过将搜索查询转换为有效的SQL查询来解析搜索查询,因此上述搜索将转换为以下格式:

query = "hobby LIKE ? OR (gender LIKE ? AND hobby LIKE ?)"
queries = ["skiing", "male", "jogging"]

对于以下查询:

where(query, queries)

但是,Rails搜索查询的一般语法非常有限:

where(query, query_1, query_2, query_3)

我不能用我想要的数组替换'query_n'参数,而Rails不会抛出错误。

NoMethodError (undefined method `where' for ["a", "b", "c"]:Array)

尝试splat数组会产生相同的错误:

where(query, *queries)

再次:

NoMethodError (undefined method `where' for ["a", "b", "c"]:Array)

那我该怎么办?

编辑:

完整搜索功能如下所示:

def self.search(search)
    query = "%#{search}%"
    if search
        includes(:games, :jobs)
        strngs = ["hobby = ? OR name = ? OR gender = ?", "dsfgdsfg", "dsgsdfgsd", "sdfsfsdf"]
        .where(strngs)

1 个答案:

答案 0 :(得分:2)

您要做的是将数组作为单个参数传递给where,其中包含查询和动态值。例如:

where(["att_1 LIKE ? OR att_2 LIKE ?", "value1", "value2"])

如果数组作为第一个也是唯一的参数传递,则数组的第一个元素将被视为模板。以下数组值被视为查询模板的动态值。

对于您的示例,不要将两个单独的变量queriesquery合并为一个query变量:

# A single array with the query AND values
query = ["hobby LIKE ? OR (gender LIKE ? AND hobby LIKE ?)", "skiing", "male", "jogging"]

# Run the `where` with a single array as the argument
YourModel.where(query)

这将允许您使用LIKE查询具有未知数量值的数据库。

  

供参考:Rails where() docs