module ActiverecordUnitwise::ClassMethods

Public Instance Methods

__define_unitwise_getter(attribute) click to toggle source
# File lib/activerecord_unitwise.rb, line 19
def __define_unitwise_getter(attribute)
  method = "def #{attribute}
      #{attribute}_scalar && #{attribute}_units ?
        Unitwise(#{attribute}_scalar, #{attribute}_units) : nil
    end
    "
  class_eval method
end
__define_unitwise_setter(attribute, convert_to:, default_unit:) click to toggle source
# File lib/activerecord_unitwise.rb, line 28
def __define_unitwise_setter(attribute, convert_to:, default_unit:)
  method = "def #{attribute}=(value, unit=nil)
    if value.blank?
      self.#{attribute}_scalar = nil
      self.#{attribute}_units  = nil
      return
    end
    unless value.kind_of?(Unitwise::Measurement)
      unless unit || #{default_unit.present?}
        raise 'must provide unit or default unit'
      end
      value = Unitwise(value.to_f, (unit || '#{default_unit}'))
    end
  "
  if convert_to.present?
    method += "
      value = value.convert_to('#{convert_to}')
    "
  end
  method += "
    self.#{attribute}_scalar = value.magnitude
    self.#{attribute}_units  = value.unit.expression
  "
  method += "end"
  class_eval method
end
unitwise(*attributes, convert_to: nil, default_unit: nil) click to toggle source
# File lib/activerecord_unitwise.rb, line 10
def unitwise(*attributes, convert_to: nil, default_unit: nil)
  attributes.each do |attribute|
    __define_unitwise_setter attribute,
      convert_to: convert_to,
      default_unit: default_unit
    __define_unitwise_getter attribute
  end
end