我知道准备好的语句,但如果我使用原始SQL,ActiveRecord是否有办法手动转义值?
像这样的东西会很好:
self.escape("O'Malley") # O\'Malley
Run Code Online (Sandbox Code Playgroud)
kon*_*nus 61
你可以做:
Dude.sanitize("O'Malley")
Run Code Online (Sandbox Code Playgroud)
要么
Dude.connection.quote("O'Malley")
Run Code Online (Sandbox Code Playgroud)
两者结果相同: => "'O''Malley'"
jem*_*ger 40
快速浏览ActiveRecord源会显示其方法"sanitize_sql_array",用于清理[string, bind_variable[, bind_variable]]sql语句的类型
你可以直接调用它:
sql = ActiveRecord::Base.send(:sanitize_sql_array, ["insert into foo (bar, baz) values (?, ?), (?, ?)", 'a', 'b', 'c', 'd'])
res = ActiveRecord::Base.connection.execute(sql)
Run Code Online (Sandbox Code Playgroud)
que*_*est 22
您可以轻松使用mysql2 gem来执行此操作:
irb(main):002:0> require 'rubygems'
=> true
irb(main):003:0> require 'mysql2'
=> true
irb(main):004:0> Mysql2::Client.escape("O'Malley") # => "O\\'Malley"
=> "O\\'Malley"
Run Code Online (Sandbox Code Playgroud)
或者如果使用早期的mysql(而不是mysql2)gem:
irb(main):002:0> require 'rubygems'
=> true
irb(main):003:0> require 'mysql'
=> true
irb(main):004:0> Mysql.escape_string("O'Malley")
=> "O\\'Malley"
Run Code Online (Sandbox Code Playgroud)
这将允许您转义所需的任何内容,然后插入数据库.您也可以使用sanitize方法在rails应用程序的大多数模型上执行此操作.例如,假设您有一个名为Person的模型.你可以做到.
Person.sanitize("O'Malley")
Run Code Online (Sandbox Code Playgroud)
这应该够了吧.
如果您不希望在使用@konus发布的解决方案时包含字符串的额外单引号,则可以执行以下操作:
Dude.connection.quote_string("O'Malley")
Run Code Online (Sandbox Code Playgroud)
这将返回"O\'Malley"而不是"'O\'Malley'"
即使Model.find_by_sql你仍然可以使用问号作为转义值的形式。
只需传递一个数组,其中第一个元素是查询,随后的元素是要替换的值。
Rails API 文档中的示例:
Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31997 次 |
| 最近记录: |