Spec-Zone.ru › Ruby on Rails 7.1

модуль 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

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

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

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

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

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

    bag = BagOfCoffee.new

    bag.weight = “0.25” bag.weight # => 0.25

    bag.weight = “” bag.weight # => nil

    bag.weight = “NaN” bag.weight # => 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