Module: DollaDollaBill::ClassMethods

Defined in:
lib/dolla_dolla_bill.rb

Instance Method Summary collapse

Instance Method Details

#money(name, options = {}) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/dolla_dolla_bill.rb', line 6

def money(name, options = {})
  cents_field_reader     = options[:cents]    || :"#{name}_in_cents"
  currency_field_reader  = options[:currency] || :"#{name}_currency"
  cents_field_writer     = :"#{cents_field_reader}="
  currency_field_writer  = :"#{currency_field_reader}="

  define_method(name) do
    return nil if send(cents_field_reader).nil? || send(currency_field_reader).nil?

    ::Money.new(send(cents_field_reader), send(currency_field_reader))
  end

  define_method("#{name}=") do |value|
    if value.nil?
      cents_value    = nil
      currency_value = nil
    else
      value          = value.to_money
      cents_value    = value.cents
      currency_value = value.currency_as_string
    end

    send(cents_field_writer,    cents_value)
    send(currency_field_writer, currency_value)
  end

  self.class.send(:define_method, "lowest_#{name}") do
    lowest =  select("#{cents_field_reader}, #{currency_field_reader}").
              order("#{cents_field_reader} ASC").
              first

    lowest.nil? ? nil : lowest.price
  end
end