如何使用 Ruby On Rails 编写 MySQL 多行条件?

How to write MySQL multilines condition with RubyOnRails?

我想用“?”在 rails 中的 MySQL 请求中搜索的字符。 比如经典的方式是:

Model.where("name = ?", '#{@search}')

我的问题是关于长查询和多行条件。 如果我想手动建立条件:

where = ""
where << " status = 1 "
where << " AND MATCH (name) AGAINST (? IN BOOLEAN MODE), @search " if @search
@records = Model.where(where)

当然不行。 那么如何使用“?” (为了安全和简单)多行条件 ?

一个简单的方法是:

where << " MATCH (name) AGAINST ('#{@search}' IN BOOLEAN MODE) "

但我会失去安全性(SQL 注入)并且如果@search 包含引号,引号可能会出现问题。

谢谢,

您对 where 的内容有点困惑:您将变量名放在字符串中,这是行不通的:字符串中的“@search”字面意思是“@search”,并且不是变量。

where 的参数视为对象数组的最佳方式,您可以像这样构建它。第一个对象是查询字符串(带有 ? 符号),其他元素是 ? 的值。符号,将由 rails.

进行清理和翻译

例如

User.where(["first_name = ? and last_name = ?", "John", "Smith"])

您可以将其他内容传递到 where,例如值的散列或单个字符串,但数组是最灵活的,尤其是在您的情况下。

牢记这一点,您可以执行类似这样的操作来构建动态创建的复杂查询:我经常使用这种模式,因为它非常灵活且可读性很强。

condition_strings = []
condition_values = []

condition_strings << "status = ?"
condition_values << 1 #or some dynamic data

condition_strings << "MATCH (name) AGAINST (? IN BOOLEAN MODE)"
condition_values << @search

conditions = [condition_strings.join(" AND ")] + condition_values
# => ["status = ? AND MATCH (name) AGAINST (? IN BOOLEAN MODE)", 1, "foo"]

#now we can use the array as an argument to `.where`:
@records = Model.where(conditions)