2012-07-20 45 views
5

当在MYSQL数据库中搜索Rails 2.3.14应用程序时,我需要适当地转义搜索字符串,以便搜索包含单引号(撇号)的字符串。什么是最好的方法来做到这一点?我使用mysql宝石,以防万一。如何从Ruby on Rails转义MYSQL查询?

回答

5

您可以使用ActiveRecord的quote方法(例如ActiveRecord::Base.connection.quote("string with ' apostrophe")),但是ActiveRecord的的查询方法已经逃脱你的SQL你。例如:

a = "string with ' apostrophe" 
ModelName.where("field1 = ?", a) 

将改变 “字符串'撇号” 到 “字符串 '' 撇号”

+1

这对于短的查询很好,但对于更复杂的查询,它实际上更容易直接使用SQL。我正在查看一个案例,我在五个不同的表中搜索,并且很难跟踪哪个变量与使用此语法的查询部分相匹配。 – joanwolk 2012-07-23 08:51:23

+0

查看范围。他们让你把你的查询分解成逻辑块,然后根据需要链接它们。它更清洁 – Angelo 2012-07-23 13:11:21

+1

我们确实有范围。另外:有问题的应用程序也使用原始SQL查询而不是Rails SQL方法作为性能考虑事项,因此我不会将此代码切换回ActiveRecord方法。 – joanwolk 2012-07-23 16:02:29

8

使用mysql宝石时,您获得方法Mysql.escape_string()。使用方法如下:

search_terms = Mysql.escape_string("it's working!") 
conditions = [ "table1.name LIKE '%#{search_terms}%'" ] 
# use conditions for MYSQL query as appropriate 
+1

哪里是这样的Postgres的? – 2014-05-06 19:48:44

8

Rails的quotes strings如下:

# Quotes a string, escaping any ' (single quote) and \ (backslash) characters. 
def quote_string(s) 
    s.gsub(/\\/, '\&\&').gsub(/'/, "''") # ' (for ruby-mode) 
end 
+0

这适用于postgresql – 2014-05-06 19:51:53

+0

这很酷,谢谢 – jahrichie 2017-05-05 00:40:05