EctoEnum v1.2.0 EctoEnum View Source

Provides defenum/2 macro for defining an Enum Ecto type.

Link to this section Summary

Link to this section Functions

Link to this macro

defenum(module, enum) View Source (macro)

Link to this macro

defenum(module, type, enum, options \\ []) View Source (macro)

Defines an enum custom Ecto.Type.

It can be used like any other Ecto.Type by passing it to a field in your model's schema block. For example:

import EctoEnum
defenum StatusEnum, registered: 0, active: 1, inactive: 2, archived: 3

defmodule User do
  use Ecto.Schema

  schema "users" do
    field :status, StatusEnum
  end
end

In the above example, the :status will behave like an enum and will allow you to pass an integer, atom or string to it. This applies to saving the model, invoking Ecto.Changeset.cast/4, or performing a query on the status field. Let's do a few examples:

iex> user = Repo.insert!(%User{status: 0})
iex> Repo.get(User, user.id).status
:registered

iex> %{changes: changes} = cast(%User{}, %{"status" => "Active"}, ~w(status), [])
iex> changes.status
:active

iex> from(u in User, where: u.status == :registered) |> Repo.all() |> length
1

Passing an invalid value to a Ecto.Changeset.cast/3 will add an error to changeset.errors field.

iex> changeset = cast(%User{}, %{"status" => "retroactive"}, ~w(status), [])
iex> changeset.errors
[status: "is invalid"]

Passing an invalid value directly into a model struct will in an error when calling Repo functions.

iex> Repo.insert!(%User{status: :none})
** (Ecto.ChangeError) `"none"` is not a valid enum value for `EctoEnumTest.StatusEnum`.
Valid enum values are `[0, 1, 2, 3, :registered, :active, :inactive, :archived, "active",
"archived", "inactive", "registered"]`

The enum type StatusEnum will also have a reflection function for inspecting the enum map in runtime.

iex> StatusEnum.__enum_map__()
[registered: 0, active: 1, inactive: 2, archived: 3]
Link to this function

validate_enum(changeset, field, error_msg \\ &default_error_msg/3) View Source
validate_enum(
  Ecto.Changeset.t(),
  atom(),
  (atom(), String.t(), [String.t() | integer() | atom()] -> String.t())
) :: Ecto.Changeset.t()