Musisz utworzyć typ Ecto dla każdego wyliczenia postgresql. W definicji schematu po prostu masz typ: :string
. W przypadku migracji ustawiasz typ na nazwę modułu. To może się naprawdę uciążliwe, choć, więc mam następujące makro w moim projekcie, który używa PostgreSQL teksty stałe:
defmodule MyDB.Enum do
alias Postgrex.TypeInfo
defmacro defenum(module, name, values, opts \\ []) do
quote location: :keep do
defmodule unquote(module) do
@behaviour Postgrex.Extension
@typename unquote(name)
@values unquote(values)
def type, do: :string
def init(_params, opts), do: opts
def matching(_), do: [type: @typename]
def format(_), do: :text
def encode(%TypeInfo{type: @typename}=typeinfo, str, args, opts) when is_atom(str), do: encode(typeinfo, to_string(str), args, opts)
def encode(%TypeInfo{type: @typename}, str, _, _) when str in @values, do: to_string(str)
def decode(%TypeInfo{type: @typename}, str, _, _), do: str
def __values__(), do: @values
defoverridable init: 2, matching: 1, format: 1, encode: 4, decode: 4
unquote(Keyword.get(opts, :do, []))
end
end
end
end
Możliwe wykorzystanie:
import MyDB.Enum
defenum ColorsEnum, "colors_enum", ~w"blue red yellow"
ColorsEnum
będzie nazwa modułu, "colors_enum"
będzie nazwa wewnętrzna do Postgresql: musisz dodać instrukcję, aby utworzyć typ wyliczeniowy w swoich migracjach baz danych. Ostatnim argumentem jest lista wartości wyliczeniowych. Użyłem sigila ~w
, które podzieli ciąg znaków na białe znaki, aby pokazać, jak zwięźle to może być. Dodałem także klauzulę, która konwertuje wartości atomów do wartości łańcuchów, gdy przechodzą przez schemat Ecto.
Wygląda na to, że "ecto_enum" nie jest już obsługiwane – ryanwinchester