我想用“?”用于在rails中搜索MySQL请求的char。 例如,经典方式是:
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) "
但是如果@search包含引号,我将失去安全性(SQL注入)并且可能会出现引号问题。
谢谢,
答案 0 :(得分:3)
你对where的内容感到有点困惑:你将变量名放在字符串中,这是行不通的:字符串里面的“@search”字面意思是“@search”而不是变量
考虑where
的参数的最佳方法是作为一个对象数组,你可以像这样构建它。第一个对象是查询字符串(带有?符号),其他元素是?的值?符号,将被铁轨消毒和翻译。
例如
User.where(["first_name = ? and last_name = ?", "John", "Smith"])
你可以将其他东西传递到哪里,比如值的散列或单个字符串,但是数组是最灵活的,特别是在你的情况下。
请记住,你可以做这样的事情来构建一个动态创建的复杂查询:我使用这个模式很多,因为它非常灵活,而且非常易读。
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)