Module: Sequel::Plugins::MoneyAccessors::ClassMethods

Defined in:
lib/sequel/plugins/money_accessors.rb

Instance Method Summary collapse

Instance Method Details

#money_accessor(amount_column, currency_column) ⇒ Object

Setup money accessor

Examples:

class Order < Sequel::Model
  money_accessor :amount, :currency
end

order = Order.create(amount: 200, currency: "EUR")
order.amount # => #<Money fractional:20000.0 currency:RUB>
order.currency # => "EUR"

Parameters:

  • amount_column (Symbol)

    amount column

  • currency_column (Symbol)

    currency column



24
25
26
27
# File 'lib/sequel/plugins/money_accessors.rb', line 24

def money_accessor(amount_column, currency_column)
  money_getter(amount_column, currency_column)
  money_setter(amount_column, currency_column)
end

#money_getter(amount_column, currency_column) ⇒ Object



29
30
31
32
33
34
35
36
37
38
# File 'lib/sequel/plugins/money_accessors.rb', line 29

def money_getter(amount_column, currency_column)
  include_accessors_module!
  @_money_accessors_module.module_eval do
    define_method(amount_column) do
      amount, currency = super(), send(currency_column)
      return unless amount && currency
      Money.from_amount(amount.to_d, currency)
    end
  end
end

#money_setter(amount_column, currency_column) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/sequel/plugins/money_accessors.rb', line 40

def money_setter(amount_column, currency_column)
  include_accessors_module!
  @_money_accessors_module.module_eval do
    define_method(:"#{amount_column}=") do |value|
      case value
      when Money
        amount = value.to_d
        currency = value.currency.to_s
      when nil
        amount = currency = nil
      else
        raise MoneyClassRequired, "#{amount_column} value must be either Money instance or nil"
      end

      super(amount)
      send(:"#{currency_column}=", currency)
    end
  end
end