def deps()
[
...
{:ash_money, "~> 0.2.5"}
]
endmix igniter.install ash_moneyThe primary thing that AshMoney provides is AshMoney.Types.Money. This is backed by ex_money. You can use it out of the box like so:
attribute :balance, AshMoney.Types.MoneyTo support money operations in runtime expressions, which use Ash's operator overloading feature, we have to tell Ash about the Ash.Type.Money using the known_type configuration.
config :ash, :known_types, [AshMoney.Types.Money]
You can add it to your compile time list of types for easier reference:
config :ash, :custom_types, money: AshMoney.Types.MoneyThen compile ash again, mix deps.compile ash --force, and refer to it like so:
attribute :balance, :moneyFirst, add the :ex_money_sql dependency to your mix.exs file.
Then add AshMoney.AshPostgresExtension to your list of installed_extensions in your repo, and generate migrations.
defmodule YourRepo do
def installed_extensions do
[..., AshMoney.AshPostgresExtension]
end
endThanks to ex_money_sql, there are excellent tools for lowering support for money into your postgres database. This allows for things like aggregates that sum amounts, and referencing money in expressions:
sum :sum_of_usd_balances, :accounts, :balance do
filter expr(balance[:currency_code] == "USD")
endAdd the following to your schema file:
object :money do
field(:amount, non_null(:decimal))
field(:currency, non_null(:string))
end
input_object :money_input do
field(:amount, non_null(:decimal))
field(:currency, non_null(:string))
end