【问题标题】:SQL query in Rails using % and LIKE在 Rails 中使用 % 和 LIKE 进行 SQL 查询
【发布时间】:2015-09-29 22:21:34
【问题描述】:

我正在尝试在我的 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")

【问题讨论】:

  • @spickermann 我很感谢你标记这个,但对我来说,它看起来不像是相同的查询结构。通过阅读您标记的帖子,我认为我的查询可能写错了,或者更恰当地说,是不安全的。您能否重新打开此问题或向我解释如何将您引用的答案应用于我的连接字符串情况以删除额外的'(撇号) - 谢谢!

标签: sql ruby-on-rails ruby


【解决方案1】:

既然你仍然使用 Rails,我建议使用 ActiveRecord's query interface 而不是普通的 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

【讨论】:

  • 非常感谢您回答我的问题。在我使用的直接查询中使用 ActiveRecord 有什么安全差异?还是有其他使用 ActiveRecord 的理由?
【解决方案2】:

你想要:

connection.query("SELECT * 
                  FROM test
                  WHERE y LIKE '%#{connection.quote(name)}%'
                  ORDER BY x ASC")

请记住,Ruby 变量插值只是将#{foo} 替换为foo 的值,不多也不少。当您在括号内添加额外的 % 时,您要求 Ruby 评估 %foo%,这不是一个有效的 Ruby 变量。

【讨论】:

  • 这被评估为'%'John'%' 并抛出错误
【解决方案3】:

您需要在引用之前在 Ruby 中添加%s:

connection.query("SELECT * 
                  FROM test
                  WHERE y LIKE #{connection.quote('%' + name + '%')}
                  ORDER BY x ASC")

connection.quote 将添加单引号以生成有效的 SQL 字符串文字,并且您希望获得 %s inside 该字符串文字,因此 Ruby 字符串连接 before em> connection.quote 被调用。

或者你可以用 SQL 来做:

connection.query("SELECT * 
                  FROM test
                  WHERE y LIKE '%' || #{connection.quote(name)} || '%'
                  ORDER BY x ASC")

|| 是标准的 SQL 字符串连接运算符,如果您使用的数据库并不真正支持 SQL,则可能需要使用 concat 函数或其他方法。

您最好按照spickermann 的建议使用 ActiveRecord 界面,但有时您需要手动操作,因此了解操作方法很有用。

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    相关资源
    最近更新 更多