Custom Ecto.Type

Version hiện tại của Ecto.Type không support một số datatype sử dụng khi validate. Ví dụ như MapSet. Thành ra đành phải tự viết để dùng.

defmodule CustomMapSet do
  @behaviour Ecto.Type
  def type, do: {:mapset, :integer}

  def cast(mapset) when is_map(mapset) do
    if mapset |> MapSet.to_list |> Enum.all?(&is_number/1) do
      {:ok, mapset}
    else
      :error
    end
  end

  def cast(mapset), do: :error
  defdelegate dump(x), to: {:mapset, :integer}
  defdelegate load(x), to: {:mapset, :integer}
end

Và khai báo trong schema:

schema "tables" dodo
    field :id, :integer
    field :custom_col, CustomMapset
end

Nguồn tham khảo: https://github.com/joekain/date_ranges/tree/master/lib/date_ranges

VietNguyen 06-07-2017