【Elixir】Ectoでの配列フィールドの定義とバリデーション方法
ElixirのEctoを使って、配列フィールドの定義とバリデーション方法についてやっていきます。
PostgreSQLの場合は配列方があるので使用するらしいです。
僕の場合は画面からのバリデーションチェックに使用する目的で使用しています。
確認環境
配列フィールドの定義
まずは配列フィールドの定義方法から見ていきましょう。
Ectoではschemaに配列フィールドを組み込むことが可能です。
以下がその基本的な方法です。
1
2
3
4
5
6
7
8
9
| defmodule SampleApp.SampleSchema do
use Ecto.Schema
schema "sample_table" do
field :sample_field, {:array, :string} # これは文字列の配列を表しています
timestamps()
end
end
|
上記のコードでは、:sample_field
という名前のフィールドが、文字列の配列として定義されています。
配列の要素のタイプを変更する場合は、:string
を適切な型に変更します。たとえば、整数の配列が必要な場合は、:integer
を使用します。
また、マイグレーションで配列フィールドを追加する場合は以下のようにします。
1
2
3
4
5
6
7
8
9
| defmodule SampleApp.Repo.Migrations.AddSampleField do
use Ecto.Migration
def change do
alter table(:sample_table) do
add :sample_field, {:array, :string}
end
end
end
|
ここでも、必要に応じて:string
を適切な型に置き換えてください。
配列フィールドのバリデーション
次に、配列フィールドに対するバリデーション方法について見ていきましょう。Ectoでは、Ecto.Changeset
モジュールを使用してデータのバリデーションを行います。
配列に対するバリデーションはカスタムバリデーション関数を作成することで実現できます。
たとえば、配列が一定の長さ以上であること、また配列内の各要素が一定の長さ以上であることを確認するバリデーションは以下のように書くことができます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| defmodule SampleApp.SampleSchema do
use Ecto.Schema
import Ecto.Changeset
schema "sample_table" do
field :sample_field, {:array, :string}
timestamps()
end
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:sample_field])
|> validate_length(:sample_field, min: 1) # 例:配列の長さが1以上であることを確認
|> validate_sample_field()
end
# カスタムバリデーション関数
defp validate_sample_field(changeset) do
sample_field = get_field(changeset, :sample_field)
# 例:配列内の各要素が一定の長さ以上であることを確認
if Enum.all?(sample_field, &(&1 |> String.length() >= 1)) do
changeset
else
add_error(changeset, :sample_field, "Each element in the array must be at least 1 character long.")
end
end
end
|
以上で、ElixirのEctoを使った配列フィールドの定義とバリデーション方法の基本的な説明が終わりです。
配列の利用とそのバリデーションは、さまざまなデータの表現と検証に役立ちますので、ぜひ上手く活用してみてください。
参考