модуль ActiveRecord::ConnectionAdapters::Quoting
Модуль Active Record Connection Adapters Quoting
Открытые методы экземпляра
# 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 Приводит значение столбца к кавычкам, чтобы предотвратить атаки 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 Приводит значение к кавычкам, чтобы использовать его как параметр связи неизвестного типа. Например, MySQL может выполнять опасное приведение типов при сравнении строки с числом, поэтому этот метод приведёт числа к строкам.
Устарело: Рассмотрите использование `Arel.sql(“… ? …”, value)` или sanitize_sql.
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 93 def quote_column_name(column_name) column_name.to_s end
Приводит имя столбца к кавычкам. По умолчанию, не приводит к кавычкам.
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 88
def quote_string(s)
s.gsub("\\", '\&\&').gsub("'", "''") # ' (for ruby-mode)
end Приводит строку к кавычкам, экранируя символы ‘ (одинарная кавычка) и \ (обратный слэш).
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 98 def quote_table_name(table_name) quote_column_name(table_name) end
Приводит имя таблицы к кавычкам. По умолчанию, использует правила приведения имени столбца к кавычкам.
# 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 Переопределяет метод для возвращения имени таблицы в кавычках для присваивания. По умолчанию, использует правила приведения имени таблицы к кавычкам.
Это работает для MySQL, где table.column используется для разрешения неоднозначностей.
Мы переопределяем этот метод в адаптерах sqlite3 и postgresql, чтобы использовать только имя столбца (согласно синтаксическим требованиям).
# 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 Приводит значения даты/времени к кавычкам для использования в SQL-запросах. Включает микросекунды, если значение является объектом Time поддерживающим usec.
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 131 def quoted_false "FALSE" end
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 123 def quoted_true "TRUE" end
# 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 Преобразует значение value к типу, понимаемому базой данных. Например, SQLite не понимает даты, поэтому этот метод преобразует Date в String.
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 135 def unquoted_false false end
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 127 def unquoted_true true end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.