module Sequel::Plugins::MoneyAccessors::ClassMethods

Public Instance Methods

money_accessor(amount_column, currency_column) click to toggle source

Setup money accessor

@param amount_column [Symbol] amount column @param currency_column [Symbol] currency column @example

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"
# 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) click to toggle source
Calls superclass method
# 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) click to toggle source
Calls superclass method
# 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

Private Instance Methods

include_accessors_module!() click to toggle source
# File lib/sequel/plugins/money_accessors.rb, line 62
def include_accessors_module!
  return if defined?(@_money_accessors_module)
  @_money_accessors_module = Module.new
  prepend @_money_accessors_module
end