Class: ActiveModel::Type::Integer
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
BigInteger, ActiveRecord::Type::DecimalWithoutScale, ActiveRecord::Type::UnsignedInteger, ActiveRecord::ConnectionAdapters::SQLite3Adapter::SQLite3Integer, ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Oid
|
|
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
Value
|
|
Instance Chain:
self,
Value
|
|
Inherits: |
ActiveModel::Type::Value
|
Defined in: | activemodel/lib/active_model/type/integer.rb |
Overview
Active Model Integer Type
::ActiveModel::Attribute
type for integer representation. This type is registered under the :integer
key.
class Person
include ActiveModel::Attributes
attribute :age, :integer
end
Values are cast using their to_i
method, except for blank strings, which are cast to nil
. If a to_i
method is not defined or raises an error, the value will be cast to 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)
::ActiveModel::Serialization
also works under the same principle. Non-numeric strings are serialized as nil
, for example.
::ActiveModel::Serialization
also validates that the integer can be stored using a limited number of bytes. If it cannot, an ::ActiveModel::RangeError
will be raised. The default limit is 4 bytes, and can be customized when declaring an attribute:
class Person
include ActiveModel::Attributes
attribute :age, :integer, limit: 6
end
Constant Summary
-
DEFAULT_LIMIT =
Column storage size in bytes. 4 bytes means an integer as opposed to smallint etc.
4
Class Method Summary
- .new ⇒ Integer constructor
Value
- Inherited
.new | Initializes a type with three basic configuration settings: precision, limit, and scale. |
Instance Attribute Summary
Value
- Inherited
Instance Method Summary
Value
- Inherited
#==, #as_json, #assert_valid_value, | |
#cast |
|
#changed? | Determines whether a value has changed for dirty checking. |
#changed_in_place? | Determines whether the mutable value has been modified since it was read. |
#deserialize | Converts a value from database input to the appropriate ruby type. |
#eql? | Alias for Value#==. |
#hash, | |
#serializable? | Returns true if this type can convert |
#serialize | Casts a value from the ruby type to a type that the database knows how to understand. |
#type | Returns the unique type name as a |
#cast_value | Convenience method for types which do not need separate type casting behavior for user and database inputs. |
Constructor Details
.new ⇒ Integer
# File 'activemodel/lib/active_model/type/integer.rb', line 51
def initialize(**) super @max = max_value @min = min_value end
Instance Method Details
#deserialize(value)
[ GitHub ]# File 'activemodel/lib/active_model/type/integer.rb', line 61
def deserialize(value) return if value.blank? value.to_i end
#serializable?(value) {|cast_value| ... } ⇒ Boolean
# File 'activemodel/lib/active_model/type/integer.rb', line 95
def serializable?(value) cast_value = cast(value) return true unless out_of_range?(cast_value) yield cast_value if block_given? false end
#serialize(value)
[ GitHub ]# File 'activemodel/lib/active_model/type/integer.rb', line 66
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
#type
[ GitHub ]# File 'activemodel/lib/active_model/type/integer.rb', line 57
def type :integer end