使用%等在Rails中进行SQL查询
我正在尝试在rails应用程序中执行SQL查询。以下命令正常执行,因为它正在查找精确匹配:使用%等在Rails中进行SQL查询,sql,ruby-on-rails,ruby,Sql,Ruby On Rails,Ruby,我正在尝试在rails应用程序中执行SQL查询。以下命令正常执行,因为它正在查找精确匹配: connection.query("SELECT * FROM test WHERE y=#{connection.quote(name)} ORDER BY x ASC") 我想使用LIKE操作符来查找部分匹配。在SQL中,它看起来像: 从测试中选择*其中y像“%John%”按x ASC排序
connection.query("SELECT *
FROM test
WHERE y=#{connection.quote(name)}
ORDER BY x ASC")
我想使用LIKE操作符来查找部分匹配。在SQL中,它看起来像:
从测试中选择*其中y像“%John%”按x ASC排序
如何在Ruby查询中实现这一点?我尝试在一些地方添加%,但没有效果。我得到的错误是,我的查询正在查找“%John%”,而不是“%John%”
你想要:
connection.query("SELECT *
FROM test
WHERE y LIKE '%#{connection.quote(name)}%'
ORDER BY x ASC")
请记住,Ruby变量插值只是将{foo}替换为foo的值,不多也不少。当您在括号内添加额外的%时,您要求Ruby计算%foo%,这不是一个有效的Ruby变量。您想要:
connection.query("SELECT *
FROM test
WHERE y LIKE '%#{connection.quote(name)}%'
ORDER BY x ASC")
请记住,Ruby变量插值只是将{foo}替换为foo的值,不多也不少。当您在括号内添加额外的%时,您要求Ruby计算%foo%,这不是一个有效的Ruby变量。既然您使用Rails,我建议您使用它而不是普通SQL 使用ActiveRecord,可以这样编写查询:
Test.where("y LIKE ?", "%#{name}%").order(:x)
您需要有一个名为Test的ActiveRecord模型,该模型被配置为使用名为Test Rails的数据库表。要实现此功能,默认命名为tests:
# in app/models/test.rb
class Test < ActiveRecord::Base
self.table_name = 'test'
end
既然您使用Rails,我建议您使用Rails而不是普通SQL 使用ActiveRecord,可以这样编写查询:
Test.where("y LIKE ?", "%#{name}%").order(:x)
您需要有一个名为Test的ActiveRecord模型,该模型被配置为使用名为Test Rails的数据库表。要实现此功能,默认命名为tests:
# in app/models/test.rb
class Test < ActiveRecord::Base
self.table_name = 'test'
end
在引用之前,您需要在Ruby中添加%s:
connection.query("SELECT *
FROM test
WHERE y LIKE #{connection.quote('%' + name + '%')}
ORDER BY x ASC")
connection.quote将添加单引号以生成有效的SQL字符串文字,并且您希望在该字符串文字中获得%s,因此将调用connection.quote之前的Ruby字符串连接
也可以在SQL中执行此操作:
connection.query("SELECT *
FROM test
WHERE y LIKE '%' || #{connection.quote(name)} || '%'
ORDER BY x ASC")
||是标准的SQL字符串连接运算符,如果您使用的数据库实际上不支持SQL,则可能需要使用concat函数或其他函数
您最好按照建议使用ActiveRecord界面,但有时您需要手工操作,因此了解如何使用非常有用。在引用之前,您需要在Ruby中添加%s:
connection.query("SELECT *
FROM test
WHERE y LIKE #{connection.quote('%' + name + '%')}
ORDER BY x ASC")
connection.quote将添加单引号以生成有效的SQL字符串文字,并且您希望在该字符串文字中获得%s,因此将调用connection.quote之前的Ruby字符串连接
也可以在SQL中执行此操作:
connection.query("SELECT *
FROM test
WHERE y LIKE '%' || #{connection.quote(name)} || '%'
ORDER BY x ASC")
||是标准的SQL字符串连接运算符,如果您使用的数据库实际上不支持SQL,则可能需要使用concat函数或其他函数
您最好按照建议使用ActiveRecord接口,但有时您需要手工操作,因此了解如何操作非常有用。这将被评估为“%”John“%”并引发错误这将被评估为“%”John“%”并引发错误error@spickermann我很感激你在这里做标记,但对我来说,这似乎不是同一个问题结构通过阅读您标记的帖子,我认为我可能写错了查询,或者更恰当地说,是不安全。您能否重新打开这个问题,或者向我解释一下,我如何将您提到的答案应用到我连接字符串的情况中,以删除额外的“撇号-谢谢@spickermann我很感谢您标记这个,但对我来说,它看起来不像是相同的查询结构。通过阅读您标记的帖子,我认为我可能写错了查询,或者更恰当地说,是不安全。您能否重新打开这个问题,或者向我解释一下,我如何将您提到的答案应用到我连接字符串的情况中,以删除额外的“撇号-谢谢!非常感谢你回答我的问题。在我使用的直接查询上使用ActiveRecord有什么安全性区别?或者使用ActiveRecord还有其他原因吗?非常感谢您回答我的问题。在我使用的直接查询上使用ActiveRecord有什么安全性区别?或者使用ActiveRecord还有其他原因吗?