Class: ActiveModel::Type::Decimal
| 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/decimal.rb | 
Overview
Active Model Decimal Type
::ActiveModel::Attribute type for decimal, high-precision floating point numeric representation. It is registered under the :decimal key.
class BagOfCoffee
  include ActiveModel::Attributes
  attribute :weight, :decimal
end
::Numeric instances are converted to ::BigDecimal instances. Any other objects are cast using their to_d method, except for blank strings, which are cast to nil. If a to_d method is not defined, the object is converted to a string using to_s, which is then cast using 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 precision defaults to 18, and can be customized when declaring an attribute:
class BagOfCoffee
  include ActiveModel::Attributes
  attribute :weight, :decimal, precision: 24
end
  Constant Summary
- 
    BIGDECIMAL_PRECISION =
    
# File 'activemodel/lib/active_model/type/decimal.rb', line 4818 
Helpers::Numeric - Included
  
Class Method Summary
Value - Inherited
| .new | Initializes a type with three basic configuration settings: precision, limit, and scale.  | 
    
Instance Attribute Summary
Helpers::Immutable - Included
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
- #type
 - #type_cast_for_schema(value)
 - #apply_scale(value) private
 - #cast_value(value) private
 - #convert_float_to_big_decimal(value) private
 - #float_precision private
 
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
This class inherits a constructor from ActiveModel::Type::Value
Instance Method Details
#apply_scale(value) (private)
[ GitHub ]# File 'activemodel/lib/active_model/type/decimal.rb', line 99
def apply_scale(value) if scale value.round(scale) else value end end
#cast_value(value) (private)
[ GitHub ]# File 'activemodel/lib/active_model/type/decimal.rb', line 59
def cast_value(value) casted_value = \ case value when ::Float convert_float_to_big_decimal(value) when ::Numeric BigDecimal(value, precision || BIGDECIMAL_PRECISION) when ::String begin value.to_d rescue ArgumentError BigDecimal(0) end else if value.respond_to?(:to_d) value.to_d else cast_value(value.to_s) end end apply_scale(casted_value) end
#convert_float_to_big_decimal(value) (private)
[ GitHub ]# File 'activemodel/lib/active_model/type/decimal.rb', line 83
def convert_float_to_big_decimal(value) if precision BigDecimal(apply_scale(value), float_precision) else value.to_d end end
#float_precision (private)
[ GitHub ]#type
[ GitHub ]# File 'activemodel/lib/active_model/type/decimal.rb', line 50
def type :decimal end
#type_cast_for_schema(value)
[ GitHub ]# File 'activemodel/lib/active_model/type/decimal.rb', line 54
def type_cast_for_schema(value) value.to_s.inspect end