モデルのchangeset
機能では、を「修正」することで、検証のためにcast
に送信されます。 :count
整数フィールドを持つ
例モデル:
def changeset(struct, params \\ %{}) do
struct
|> cast(fix_params(params), [:count])
|> validate_required([:count])
end
defp fix_params(%{count: "n/a"} = params), do: %{params | count: 0}
defp fix_params(params), do: params
デモ:あなたは任意の非整数値が0に変換したい場合は
iex(1)> Counter.changeset(%Counter{}, %{count: 123})
#Ecto.Changeset<action: nil, changes: %{count: 123}, errors: [],
data: #MyApp.Counter<>, valid?: true>
iex(2)> Counter.changeset(%Counter{}, %{count: "n/a"})
#Ecto.Changeset<action: nil, changes: %{count: 0}, errors: [],
data: #MyApp.Counter<>, valid?: true>
iex(3)> Counter.changeset(%Counter{}, %{count: "foo"})
#Ecto.Changeset<action: nil, changes: %{},
errors: [count: {"is invalid", [type: :integer]}], data: #MyApp.Counter<>,
valid?: false>
は、あなたが行うことができます。
defp fix_params(%{count: count} = params) when not is_integer(count), do: %{params | count: 0}
defp fix_params(params), do: params
デモ:
iex(1)> Counter.changeset(%Counter{}, %{count: "foo"})
#Ecto.Changeset<action: nil, changes: %{count: 0}, errors: [],
data: #MyApp.Counter<>, valid?: true>
ありがとう@Dogbert!カスタムタイプを使用する良い例がたくさんあるわけではありません。これはトップのヒットhttp://learningelixir.joekain.com/custom-types-in-ecto/です。私はカスタムタイプと "クリーナー"機能を使用するという決定は、あなたが何をする必要があるのか複雑になると思いますか? – jacklin