Ecto.Enum
Provides defenum/2
macro for defining an Enum Ecto type.
Summary↑
cast(term) | |
cast(atom, enum_map) | |
defenum(module, enum_kw) | Defines an enum custom |
dump() | |
dump(int, enum_kw, enum_map_string) |
Functions
Macros
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 Ecto.Enum
defenum StatusEnum, registered: 0, active: 1, inactive: 2, archived: 3
defmodule User do
use Ecto.Model
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 a value that the custom Enum type does not recognize will result in an error.
iex> Repo.insert!(%User{status: :none})
** (Elixir.Ecto.Enum.Error) :none is not a valid enum value
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]