跳至内容 跳至搜索
方法
S

常量

VERSION = "10.0.0"
 

类公共方法

sql(sql_string, *positional_binds, retryable: false, **named_binds)

包装一个已知安全的 SQL 字符串,用于传递给查询方法,例如:

Post.order(Arel.sql("REPLACE(title, 'misc', 'zzzz') asc")).pluck(:id)

应格外小心,以避免 SQL 注入漏洞。此方法不应与不安全的值(如请求参数或模型属性)一起使用。

请查看 安全指南 以获取更多信息。

要构建更复杂的查询片段,包括用户提供值的使用,sql_string 可以包含 ?:key 占位符,分别对应附加参数。请注意,此行为仅在调用中提供了绑定值参数时适用;如果没有它们,占位符将按原样传递给查询,不具有特殊含义。

:retryable 选项可用于标记 SQL 是安全的,可以重试。仅当 SQL 是幂等的,因为它可能会被执行一次以上时,才使用此选项。

# File activerecord/lib/arel.rb, line 52
def self.sql(sql_string, *positional_binds, retryable: false, **named_binds)
  if Arel::Nodes::SqlLiteral === sql_string
    sql_string
  elsif positional_binds.empty? && named_binds.empty?
    Arel::Nodes::SqlLiteral.new(sql_string, retryable: retryable)
  else
    Arel::Nodes::BoundSqlLiteral.new sql_string, positional_binds, named_binds
  end
end