Rails SQL 使用 LIKE 查询未知(动态)数量的查询
Rails SQL query on unknown (dynamic) number of queries using 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)
您要做的是将一个数组作为单个参数传递给 where
,其中包含查询和动态值。例如:
where(["att_1 LIKE ? OR att_2 LIKE ?", "value1", "value2"])
如果数组作为第一个也是唯一的参数传递,则数组的第一个元素将被视为模板。以下数组值被视为查询模板的动态值。
对于您的示例,不是有两个单独的变量 queries
和 query
,而是将它们组合成一个 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
.
查询具有未知数量值的数据库
For reference: Rails where() docs
我有一个执行动态查询的 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)
您要做的是将一个数组作为单个参数传递给 where
,其中包含查询和动态值。例如:
where(["att_1 LIKE ? OR att_2 LIKE ?", "value1", "value2"])
如果数组作为第一个也是唯一的参数传递,则数组的第一个元素将被视为模板。以下数组值被视为查询模板的动态值。
对于您的示例,不是有两个单独的变量 queries
和 query
,而是将它们组合成一个 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
.
For reference: Rails where() docs