使用有什么区别?清理ActiveRecord中的字段时的%和%?

Ale*_*ark 5 ruby ruby-on-rails sanitize ruby-on-rails-2 rails-activerecord

我对使用问号之间的差异感到困惑,例如

Foo.find(:all, :conditions => ['bar IN (?)', @dangerous])
Run Code Online (Sandbox Code Playgroud)

并使用sprintf样式字段类型,例如

Bar.find(:all, :conditions => ['qux IN (%s)', @dangerous])
Run Code Online (Sandbox Code Playgroud)

消毒投入.是否有任何安全优势,如果你知道你正在寻找一个数字 - 比如一个ID - 而不是一个字符串,在使用%d over?,或者你只是在字符串出现时要求一个大的讨厌错误?

Rails 3和4中的更新.where语法是否会发生这种变化?

Ste*_*fan 2

%s适用于字符串。主要区别是%s不添加引号。从ActiveRecord::QueryMethods.where

最后,您可以在模板中使用 sprintf 样式的 % 转义符。这与之前的方法略有不同;您有责任确保模板中的值得到正确引用。这些值将传递到连接器以进行引用,但调用者负责确保它们在生成的 SQL 中用引号引起来。引用后,使用与 Ruby 核心方法相同的转义符插入值Kernel::sprintf

例子:

User.where(["name = ? and email = ?", "Joe", "joe@example.com"])
# SELECT * FROM users WHERE name = 'Joe' AND email = 'joe@example.com';

User.where(["name = '%s' and email = '%s'", "Joe", "joe@example.com"])
# SELECT * FROM users WHERE name = 'Joe' AND email = 'joe@example.com';
Run Code Online (Sandbox Code Playgroud)

更新:

您正在传递一个数组。%s似乎需要.to_s论证,所以这可能不会按预期工作:

User.where("name IN (%s)", ["foo", "bar"])
# SELECT * FROM users WHERE (name IN ([\"foo\", \"bar\"]))

User.where("name IN (?)", ["foo", "bar"])
# SELECT * FROM users WHERE (name IN ('foo','bar'))
Run Code Online (Sandbox Code Playgroud)

对于简单的查询,您可以使用哈希符号:

User.where(name: ["foo", "bar"])
# SELECT * FROM users WHERE name IN ('foo', 'bar')
Run Code Online (Sandbox Code Playgroud)