(この記事は、「サーバーサイドプログラミング Advent Calendar 2017」の3日目です)
fukuoka.ex代表のpiacereです
ご覧いただいて、ありがとうございます
今回は、前回の続きで、Phoenixで自動生成したAPIの、DBアクセッサ/バリデータについて、コード解析します
お知らせ:Elixir MeetUpを6月末に開催します
「fukuoka.ex#11:DB/データサイエンスにコネクトするElixir」を6/22(金)19時に開催します
fukuoka.exの発足から、ちょうど1周年となる、記念的なイベントでもあるため、このコラムを気に入っていただいた方と、ぜひ一緒に盛り上がりたいです
福岡近辺にお住まいの方であれば、遊びに来てください
大人気により、一度は満席となりましたが、増枠しましたので、下記URLよりご参加ください
https://fukuokaex.connpass.com/event/87241
特別ゲストは、Erlang/Elixirの両面で世界的に有名な「力武 健次さん」と、北九州の飯塚市で「e-ZUKA Tech Night」を6年間主催し続けるハウインターナショナルの「谷口 耕平さん」のお二人と、実に豪華なイベントです
私は、今回のシリーズを踏まえた、「1家に1台、パーソナルなデータ分析AIを全員が持つ2020年を作る」というタイトルで、Elixirによる、ブラウザUI上からサクっとデータ分析プラットフォームを披露するLTをお届けします
DBアクセッサとバリデータ
APIのリクエスト/レスポンスの解析/改造は、前回までの内容だけで充分やっていけるのですが、ついでに、DBアクセッサとバリデータについても把握しておいた方が、Phoenixの理解は進むので、ついでに解説しておきます
DBアクセッサは、下記モジュール(≒mix phx.gen.jsonで第1引数に指定した名前で作られる)に集約されています
list_sample()がコントローラのindex()から呼ばれ、create_sample()がコントローラのcreate()から呼ばれます
このモジュール内容は、APIだけで無く、「mix phx.gen.html~」で自動生成するWebのときも、同じ内容で生成されます
defmodule SampleAnalytics.Api do
…
def list_sample do
Repo.all(Sample)
end
…
def create_sample(attrs \\ %{}) do
%Sample{}
|> Sample.changeset(attrs)
|> Repo.insert()
end
…
バリデータは、下記モジュールのchangeset()として生成されます
changeset()は、上記DBアクセッサモジュールのcreate_sample()やupdate_sample()から、DBデータ更新(≒Repo.insert()やRepo.update())直前に呼ばれます
このモジュール内容も、「mix phx.gen.html~」で自動生成するWebのときと同じですし、DBアクセッサにてDBデータ更新直前にchangeset()が呼ばれる点も同じです
defmodule SampleAnalytics.Api.Sample do
use Ecto.Schema
import Ecto.Changeset
schema "sample" do
field :body, :string
field :title, :string
timestamps()
end
@doc false
def changeset(sample, attrs) do
sample
|> cast(attrs, [:title, :body])
|> validate_required([:title, :body])
end
end
なお、changeset()内で呼べるバリデーション処理については、「elixir on phoenix changesetでのValidates」をご覧いただくと参考になると思います
終わり
今回は、Phoenix APIのDBアクセッサ/バリデータのコードの流れを解析しました
DBアクセッサをいじる機会は、そこまでは無いと思いますが、一方でバリデータは、比較的カスタマイズする機会がありますので、キャッチアップしておくと、Phoenix API開発がスムースになるかと思います