postgresqlの列挙型ごとにEctoタイプを作成する必要があります。スキーマ定義では、タイプは:string
である必要があります。マイグレーションでは、タイプをモジュール名に設定します。しかし、これは本当に退屈得ることができますので、私はPostgreSQLの列挙型を使用しています私のプロジェクトでは、以下のマクロがあります。
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
可能な使用:
import MyDB.Enum
defenum ColorsEnum, "colors_enum", ~w"blue red yellow"
ColorsEnum
がモジュール名となり、"colors_enum"
になりますPostgresqlのenum name internal:データベース移行で列挙型を作成するために文を追加する必要があります。最後の引数はenum値のリストです。 ~w
sigilを使用して、文字列を空白で分割して、これがどれくらい簡潔であるかを示しました。また、Ectoスキーマを通過するときに原子値を文字列値に変換する節を追加しました。
'ecto_enum'のように見えません。 – ryanwinchester