Module: ActiverecordUnitwise::ClassMethods

Defined in:
lib/activerecord_unitwise.rb

Instance Method Summary collapse

Instance Method Details

#__define_unitwise_getter(attribute) ⇒ Object



19
20
21
22
23
24
25
26
# 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:) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 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) ⇒ Object



10
11
12
13
14
15
16
17
# 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