Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用%等在Rails中进行SQL查询_Sql_Ruby On Rails_Ruby - Fatal编程技术网

使用%等在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排序

我正在尝试在rails应用程序中执行SQL查询。以下命令正常执行,因为它正在查找精确匹配:

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还有其他原因吗?