AshMoney provides AshMoney.Types.Money (aliased as :money if configured), backed by ex_money.
attribute :balance, :money
attribute :balance, AshMoney.Types.Moneystorage_type—:money_with_currency(default, requiresex_money_sqlfor Postgres) or:mapmin/max— decimal bounds on the amountex_money_opts— keyword list passed toMoney.new/3
attribute :charge, :money do
constraints min: Decimal.new("0"), max: Decimal.new("1000")
endMoney.new(:USD, "100.00")
Money.new!("EUR", Decimal.new("50"))In expressions (composite type):
composite_type(%{currency: "USD", amount: Decimal.new("0")}, :money)Supported in Ash expressions (runtime and Postgres when the extension is installed):
+— add twoMoneyvalues-— subtract twoMoneyvalues; unary negation*— multiplyMoneyby adecimal<,<=,>,>=— compare twoMoneyvalues, orMoneyagainst adecimal
Currency mismatches raise errors. All arithmetic requires matching currencies.
With AshMoney.AshPostgresExtension installed, money operations push down to SQL. Access composite fields in expressions via:
filter expr(balance[:currency_code] == "USD")Aggregates work naturally:
sum :total, :line_items, :amount