класс ActiveRecord::Type::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
Константы
- DEFAULT_LIMIT
-
Размер хранилища столбца в байтах. 4 байта означают целое число, в отличие от smallint и т. д.
Открытые методы класса
# File activemodel/lib/active_model/type/integer.rb, line 52 def initialize(**) super @max = max_value @min = min_value end
Открытые методы экземпляра
# File activemodel/lib/active_model/type/integer.rb, line 62 def deserialize(value) return if value.blank? value.to_i end
# File activemodel/lib/active_model/type/integer.rb, line 96 def serializable?(value) cast_value = cast(value) return true unless out_of_range?(cast_value) yield cast_value if block_given? false end
# File activemodel/lib/active_model/type/integer.rb, line 67
def serialize(value)
case value
when ::Integer
# noop
when ::String
int = value.to_i
if int.zero? && value != "0"
return if non_numeric_string?(value)
end
value = int
else
value = super
end
if out_of_range?(value)
raise ActiveModel::RangeError, "#{value} is out of range for #{self.class} with limit #{_limit} bytes"
end
value
end # File activemodel/lib/active_model/type/integer.rb, line 58 def type :integer end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.