我正在尝试在我的rails应用程序中执行SQL查询。以下执行正常,因为它正在寻找完全匹配:
connection.query("SELECT *
FROM test
WHERE y=#{connection.quote(name)}
ORDER BY x ASC")
我想使用LIKE运算符来查找部分匹配。在SQL中它看起来像:
SELECT * FROM test WHERE y LIKE '%John%' ORDER BY x ASC
我如何在Ruby查询中执行此操作?我尝试在几个地方添加%
,但它不起作用。我收到的错误表明我的查询正在寻找%'John'%
而不是'%John%'
connection.query("SELECT *
FROM test
WHERE y LIKE #{%connection.quote(name)%}
ORDER BY x ASC")
答案 0 :(得分:5)
因为你无论如何都使用Rails我建议使用ActiveRecord's query interface而不是普通的SQL。
使用ActiveRecord
,查询可以这样写:
Test.where("y LIKE ?", "%#{name}%").order(:x)
您需要一个名为ActiveRecord
的{{1}}模型,该模型配置为使用名为Test
的数据库表(Rails默认命名为test
)来完成此工作:
tests
答案 1 :(得分:1)
你想:
connection.query("SELECT *
FROM test
WHERE y LIKE '%#{connection.quote(name)}%'
ORDER BY x ASC")
请记住,Ruby变量插值只是将#{foo}替换为foo
的值,不多也不少。当您在括号内添加额外的%时,您要求Ruby评估%foo%
,这不是有效的Ruby变量。
答案 2 :(得分:0)
您需要在引用之前在Ruby中添加%
:
connection.query("SELECT *
FROM test
WHERE y LIKE #{connection.quote('%' + name + '%')}
ORDER BY x ASC")
connection.quote
将添加单引号以生成有效的SQL字符串文字,并且您希望获得<{1}} 里面的字符串文字,因此Ruby字符串连接在调用 %
之前。
或者您可以在SQL中执行此操作:
connection.quote
connection.query("SELECT *
FROM test
WHERE y LIKE '%' || #{connection.quote(name)} || '%'
ORDER BY x ASC")
是标准的SQL字符串连接运算符,如果您使用的数据库并不真正支持SQL,则可能需要使用||
函数或其他内容。
您最好使用ActiveRecord界面spickermann建议,但有时您需要手动执行此操作,因此了解具体方法非常有用。