Class: ActiveModel::Type::Integer
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
|
|
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
Value
|
|
Instance Chain:
|
|
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
Helpers::Numeric
- Included
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
#limit, #precision, #scale, | |
#binary? | These predicates are not documented, as I need to look further into their use, and see if they can be removed entirely. |
#mutable?, #serialized? |
Instance Method Summary
- #deserialize(value)
- #serializable?(value) {|cast_value| ... } ⇒ Boolean
- #serialize(value)
- #type
- #_limit private
- #cast_value(value) private
- #max_value private
- #min_value private
- #out_of_range?(value) ⇒ Boolean private
- #serialize_cast_value(value) Internal use only
Helpers::Numeric
- Included
#cast, #changed?, #serialize, #serialize_cast_value, #equal_nan?, #non_numeric_string?, #number_to_non_number? |
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. |
#force_equality?, #map, | |
#type_cast_for_schema |
|
#value_constructed_by_mass_assignment? |
SerializeCastValue
- Included
Constructor Details
.new ⇒ Integer
Instance Method Details
#_limit (private)
[ GitHub ]# File 'activemodel/lib/active_model/type/integer.rb', line 119
def _limit limit || DEFAULT_LIMIT end
#cast_value(value) (private)
[ GitHub ]# File 'activemodel/lib/active_model/type/integer.rb', line 107
def cast_value(value) value.to_i rescue nil end
#deserialize(value)
[ GitHub ]# File 'activemodel/lib/active_model/type/integer.rb', line 61
def deserialize(value) return if value.blank? value.to_i end
#max_value (private)
[ GitHub ]# File 'activemodel/lib/active_model/type/integer.rb', line 111
def max_value 1 << (_limit * 8 - 1) # 8 bits per byte with one bit for sign end
#min_value (private)
[ GitHub ]# File 'activemodel/lib/active_model/type/integer.rb', line 115
def min_value -max_value end
#out_of_range?(value) ⇒ Boolean (private)
# File 'activemodel/lib/active_model/type/integer.rb', line 103
def out_of_range?(value) value && (@max <= value || @min > value) 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
#serialize_cast_value(value)
# File 'activemodel/lib/active_model/type/integer.rb', line 87
def serialize_cast_value(value) # :nodoc: 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