跳至内容 跳至搜索

Active Record 连接适配器引用

方法
Q
T
U

实例公共方法

quote(value)

引用列值以帮助防止 SQL 注入攻击.

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 12
def quote(value)
  case value
  when String, Symbol, ActiveSupport::Multibyte::Chars
    "'#{quote_string(value.to_s)}'"
  when true       then quoted_true
  when false      then quoted_false
  when nil        then "NULL"
  # BigDecimals need to be put in a non-normalized form and quoted.
  when BigDecimal then value.to_s("F")
  when Numeric then value.to_s
  when Type::Binary::Data then quoted_binary(value)
  when Type::Time::Value then "'#{quoted_time(value)}'"
  when Date, Time then "'#{quoted_date(value)}'"
  when Class      then "'#{value}'"
  when ActiveSupport::Duration
    warn_quote_duration_deprecated
    value.to_s
  else raise TypeError, "can't quote #{value.class.name}"
  end
end

quote_bound_value(value)

引用一个值作为未知类型的绑定参数。例如,MySQL 在比较字符串和数字时可能会执行危险的强制转换,因此此方法会将数字强制转换为字符串。

已弃用:请考虑使用 ‘Arel.sql(“… ? …”, value)` 或 sanitize_sql 代替。

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 57
      def quote_bound_value(value)
        ActiveRecord.deprecator.warn(<<~MSG.squish)
          #quote_bound_value is deprecated and will be removed in Rails 7.2.
          Consider Arel.sql(".. ? ..", value) or #sanitize_sql instead.
        MSG

        quote(cast_bound_value(value))
      end

quote_column_name(column_name)

引用列名。默认不加引号。

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 93
def quote_column_name(column_name)
  column_name.to_s
end

quote_string(s)

引用字符串,转义任何 '(单引号)和 \(反斜杠)字符。

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 88
def quote_string(s)
  s.gsub("\\", '\&\&').gsub("'", "''") # ' (for ruby-mode)
end

quote_table_name(table_name)

引用表名。默认使用列名引用。

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 98
def quote_table_name(table_name)
  quote_column_name(table_name)
end

quote_table_name_for_assignment(table, attr)

覆盖以返回用于赋值的引用表名。默认使用表引用。

这适用于 MySQL,其中 table.column 可用于解决歧义。

我们在 sqlite3 和 postgresql 适配器中覆盖了它,以仅使用列名(根据语法要求)。

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 110
def quote_table_name_for_assignment(table, attr)
  quote_table_name("#{table}.#{attr}")
end

quoted_date(value)

引用日期/时间值以用于 SQL 输入。如果该值是响应 usec 的 Time,则包括微秒。

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 141
def quoted_date(value)
  if value.acts_like?(:time)
    if default_timezone == :utc
      value = value.getutc if !value.utc?
    else
      value = value.getlocal
    end
  end

  result = value.to_fs(:db)
  if value.respond_to?(:usec) && value.usec > 0
    result << "." << sprintf("%06d", value.usec)
  else
    result
  end
end

quoted_false()

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 131
def quoted_false
  "FALSE"
end

quoted_true()

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 123
def quoted_true
  "TRUE"
end

type_cast(value)

value 转换为数据库可以理解的类型。例如,SQLite 不理解日期,因此此方法将把 Date 转换为 String

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 36
def type_cast(value)
  case value
  when Symbol, ActiveSupport::Multibyte::Chars, Type::Binary::Data
    value.to_s
  when true       then unquoted_true
  when false      then unquoted_false
  # BigDecimals need to be put in a non-normalized form and quoted.
  when BigDecimal then value.to_s("F")
  when nil, Numeric, String then value
  when Type::Time::Value then quoted_time(value)
  when Date, Time then quoted_date(value)
  else raise TypeError, "can't cast #{value.class.name}"
  end
end

unquoted_false()

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 135
def unquoted_false
  false
end

unquoted_true()

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 127
def unquoted_true
  true
end