Spec-Zone.ru › Ruby on Rails 4.1

модуль ActiveRecord::ConnectionAdapters::Quoting

Публичные методы экземпляров

quote(value, column = nil) Показать исходный код

Приводит значение столбца к кавычкам, чтобы предотвратить атаки SQL-инъекции.

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 8
def quote(value, column = nil)
  # records are quoted as their primary key
  return value.quoted_id if value.respond_to?(:quoted_id)

  case value
  when String, ActiveSupport::Multibyte::Chars
    value = value.to_s
    return "'#{quote_string(value)}'" unless column

    case column.type
    when :integer then value.to_i.to_s
    when :float then value.to_f.to_s
    else
      "'#{quote_string(value)}'"
    end

  when true, false
    if column && column.type == :integer
      value ? '1' : '0'
    else
      value ? quoted_true : quoted_false
    end
    # BigDecimals need to be put in a non-normalized form and quoted.
  when nil        then "NULL"
  when BigDecimal then value.to_s('F')
  when Numeric, ActiveSupport::Duration
    if column.try(:type) == :string
      quote(value.to_s, column)
    else
      value.to_s
    end
  when Date, Time then "'#{quoted_date(value)}'"
  when Symbol     then "'#{quote_string(value.to_s)}'"
  when Class      then "'#{value.to_s}'"
  else
    "'#{quote_string(YAML.dump(value))}'"
  end
end
quote_column_name(column_name) Показать исходный код

Приводит имя столбца к кавычкам. По умолчанию кавычки не используются.

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 92
def quote_column_name(column_name)
  column_name
end
quote_string(s) Показать исходный код

Приводит строку к кавычкам, экранируя символы ' (одинарная кавычка) и \ (обратный слэш).

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 87
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 97
def quote_table_name(table_name)
  quote_column_name(table_name)
end
quote_table_name_for_assignment(table, attr) Показать исходный код

Переопределяет метод для возвращения имени таблицы в кавычках для присваивания. По умолчанию используется кавычка для имени таблицы.

Это работает для mysql и mysql2, где можно использовать table.column для разрешения неоднозначности.

Мы переопределяем его в адаптерах sqlite и postgresql, чтобы использовать только имя столбца (в соответствии с требованиями синтаксиса).

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 109
def quote_table_name_for_assignment(table, attr)
  quote_table_name("#{table}.#{attr}")
end
quoted_date(value) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 121
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

  value.to_s(:db)
end
quoted_false() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 117
def quoted_false
  "'f'"
end
quoted_true() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 113
def quoted_true
  "'t'"
end
type_cast(value, column) Показать исходный код

Преобразует value в тип, понятный для базы данных. Например, SQLite не понимает даты, поэтому этот метод преобразует Date в String.

# File activerecord/lib/active_record/connection_adapters/abstract/quoting.rb, line 50
def type_cast(value, column)
  if value.respond_to?(:quoted_id) && value.respond_to?(:id)
    return value.id
  end

  case value
  when String, ActiveSupport::Multibyte::Chars
    value = value.to_s
    return value unless column

    case column.type
    when :integer then value.to_i
    when :float then value.to_f
    else
      value
    end

  when true, false
    if column && column.type == :integer
      value ? 1 : 0
    else
      value ? 't' : 'f'
    end
    # BigDecimals need to be put in a non-normalized form and quoted.
  when nil        then nil
  when BigDecimal then value.to_s('F')
  when Numeric    then value
  when Date, Time then quoted_date(value)
  when Symbol     then value.to_s
  else
    to_type = column ? " to #{column.type}" : ""
    raise TypeError, "can't cast #{value.class}#{to_type}"
  end
end

© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API