модуль ActiveRecord::ConnectionAdapters::Quoting
Открытые методы экземпляра
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 71
def fetch_type_metadata(sql_type)
cast_type = lookup_cast_type(sql_type)
SqlTypeMetadata.new(
sql_type: sql_type,
type: cast_type.type,
limit: cast_type.limit,
precision: cast_type.precision,
scale: cast_type.scale,
)
end # File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 9
def quote(value)
value = id_value_for_database(value) if value.is_a?(Base)
if value.respond_to?(:quoted_id)
at = value.method(:quoted_id).source_location
at &&= " at %s:%d" % at
owner = value.method(:quoted_id).owner.to_s
klass = value.class.to_s
klass += "(#{owner})" unless owner == klass
ActiveSupport::Deprecation.warn "Defining #quoted_id is deprecated and will be ignored in Rails 5.2. (defined on #{klass}#{at})"
return value.quoted_id
end
_quote(value)
end Приводит значение столбца к кавычкам, чтобы предотвратить атаки типа SQL-инъекция.
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 89 def quote_column_name(column_name) column_name.to_s end
Приводит имя столбца к кавычкам. По умолчанию кавычки не используются.
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 84
def quote_string(s)
s.gsub('\'.freeze, '\&\&'.freeze).gsub("'".freeze, "''".freeze) # ' (for ruby-mode)
end Приводит строку к кавычкам, экранируя символы ' (одинарная кавычка) и \ (обратный слэш).
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 94 def quote_table_name(table_name) quote_column_name(table_name) end
Приводит имя таблицы к кавычкам. По умолчанию используется приведение имени столбца к кавычкам.
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 106
def quote_table_name_for_assignment(table, attr)
quote_table_name("#{table}.#{attr}")
end Переопределяет метод для возвращения имени таблицы в кавычках для присваивания. По умолчанию используется приведение имени таблицы к кавычкам.
Это работает для mysql2, где table.column может использоваться для разрешения неоднозначности.
Мы переопределяем это в адаптерах sqlite3 и postgresql для использования только имени столбца (в соответствии с требованиями синтаксиса).
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 137
def quoted_date(value)
if value.acts_like?(:time)
zone_conversion_method = ActiveRecord::Base.default_timezone == :utc ? :getutc : :getlocal
if value.respond_to?(zone_conversion_method)
value = value.send(zone_conversion_method)
end
end
result = value.to_s(: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 127 def quoted_false "'f'".freeze end
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 119 def quoted_true "'t'".freeze end
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 31
def type_cast(value, column = nil)
value = id_value_for_database(value) if value.is_a?(Base)
if value.respond_to?(:quoted_id) && value.respond_to?(:id)
return value.id
end
if column
value = type_cast_from_column(column, value)
end
_type_cast(value)
rescue TypeError
to_type = column ? " to #{column.type}" : ""
raise TypeError, "can't cast #{value.class}#{to_type}"
end Преобразует значение в тип, понятный для базы данных. Например, SQLite не понимает даты, поэтому этот метод преобразует объект Date в String.
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 131 def unquoted_false "f".freeze end
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 123 def unquoted_true "t".freeze end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.