如何用RubyOnRails编写MySQL多线条件?

时间:2016-02-16 08:57:19

标签: mysql ruby-on-rails conditional-statements quote

我想用“?”用于在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注入)并且可能会出现引号问题。

谢谢,

1 个答案:

答案 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)