Spec-Zone.ru › Ruby on Rails 8.1

module ActiveRecord::Type

Константы

BigInteger

Тип BigInteger Active Model

Тип атрибута для целых чисел, которые можно сериализовать в неограниченное количество байтов. Этот тип зарегистрирован под ключом :big_integer.

class Person
  include ActiveModel::Attributes

  attribute :id, :big_integer
end

person = Person.new
person.id = "18_000_000_000"

person.id # => 18000000000

Приведение типов и сериализация выполняются так же, как и для стандартного типа ActiveModel::Type::Integer.

Binary

Тип Binary Active Model

Тип атрибута для представления двоичных данных. Этот тип зарегистрирован под ключом :binary.

Значения, не являющиеся строками, преобразуются в строки с помощью метода to_s.

Boolean

Тип Boolean Active Model

Класс, который ведет себя как логический тип, включая правила преобразования пользовательского ввода.

  • "false", "f", "0", 0 или любое другое значение из FALSE_VALUES будет преобразовано в false.

  • Пустые строки преобразуются в nil.

  • Все остальные значения будут преобразованы в true.

Decimal

Тип Decimal Active Model

Тип атрибута для десятичных чисел с плавающей точкой и высокой точностью. Он зарегистрирован под ключом :decimal.

class BagOfCoffee
  include ActiveModel::Attributes

  attribute :weight, :decimal
end

Экземпляры Numeric преобразуются в экземпляры BigDecimal. Любые другие объекты преобразуются с помощью метода to_d, за исключением пустых строк, которые преобразуются в nil. Если метод to_d не определен, объект преобразуется в строку с помощью to_s, после чего выполняется приведение с помощью to_d.

bag = BagOfCoffee.new

bag.weight = 0.01
bag.weight # => 0.1e-1

bag.weight = "0.01"
bag.weight # => 0.1e-1

bag.weight = ""
bag.weight # => nil

bag.weight = :arbitrary
bag.weight # => nil (the result of `.to_s.to_d`)

Точность Decimal по умолчанию равна 18; ее можно настроить при объявлении атрибута:

class BagOfCoffee
  include ActiveModel::Attributes

  attribute :weight, :decimal, precision: 24
end
Float

Тип Float Active Model

Тип атрибута для числовых значений с плавающей точкой. Он зарегистрирован под ключом :float.

class BagOfCoffee
  include ActiveModel::Attributes

  attribute :weight, :float
end

bag = BagOfCoffee.new

bag.weight = "0.25"
bag.weight # => 0.25

bag.weight = ""
bag.weight # => nil

bag.weight = "NaN"
bag.weight # => Float::NAN

Значения преобразуются с помощью метода to_f, за исключением следующих строк:

  • Пустые строки преобразуются в nil.

  • "Infinity" преобразуется в Float::INFINITY.

  • "-Infinity" преобразуется в -Float::INFINITY.

  • "NaN" преобразуется в Float::NAN.

ImmutableString

Тип ImmutableString Active Model

Тип атрибута для представления неизменяемых строк. Он преобразует входящие значения в замороженные строки.

class Person
  include ActiveModel::Attributes

  attribute :name, :immutable_string
end

person = Person.new
person.name = 1

person.name # => "1"
person.name.frozen? # => true

Значения преобразуются в строки с помощью метода to_s. Однако значения типа Boolean обрабатываются иначе: true преобразуется в "t", а false — в "f". Эти строки можно настроить при объявлении атрибута:

class Person
  include ActiveModel::Attributes

  attribute :active, :immutable_string, true: "aye", false: "nay"
end

person = Person.new
person.active = true

person.active # => "aye"
Integer

Тип Integer Active Model

Тип атрибута для представления целых чисел. Этот тип зарегистрирован под ключом :integer.

class Person
  include ActiveModel::Attributes

  attribute :age, :integer
end

Значения преобразуются с помощью метода to_i, за исключением пустых строк, которые преобразуются в nil. Если метод to_i не определен или вызывает ошибку, значение преобразуется в nil.

person = Person.new

person.age = "18"
person.age # => 18

person.age = ""
person.age # => nil

person.age = :not_an_integer
person.age # => nil (because Symbol does not define #to_i)

Serialization работает по тому же принципу. Например, нечисловые строки сериализуются как nil.

Serialization также проверяет, можно ли сохранить целое число, используя ограниченное количество байтов. Если это невозможно, будет вызвано исключение ActiveModel::RangeError. По умолчанию ограничение составляет 4 байта; его можно настроить при объявлении атрибута:

class Person
  include ActiveModel::Attributes

  attribute :age, :integer, limit: 6
end
String

Тип String Active Model

Тип атрибута для строк. Он зарегистрирован под ключом :string.

Этот класс является специализацией ActiveModel::Type::ImmutableString. Он выполняет преобразование так же и настраивается так же. Однако он учитывает изменяемые строки, поэтому отслеживание изменений может корректно определять, изменилась ли строка.

Value

Тип Value Active Model

Базовый класс для всех типов атрибутов. Этот класс также служит типом по умолчанию для атрибутов, для которых тип не указан.

Публичные методы класса

register (type_name, klass = nil, **options, &block) Показать исходный код
# File activerecord/lib/active_record/type.rb, line 37
def register(type_name, klass = nil, **options, &block)
  registry.register(type_name, klass, **options, &block)
end

Добавляет новый тип в реестр, позволяя обращаться к нему по символу из ActiveRecord::Base.attribute. Если ваш тип предназначен для использования только с определенным адаптером базы данных, можно передать adapter: :postgresql. Если имя вашего типа совпадает с именем встроенного типа текущего адаптера, будет вызвано исключение, если не указать параметр :override. override: true приведет к тому, что вместо встроенного типа будет использоваться ваш тип. override: false приведет к тому, что при наличии встроенного типа он будет использоваться вместо вашего.

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

Spec-Zone.ru

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