Railsでの区分値管理においては、下記の記事で説明されている通り、ActiveHash::Enumが非常に有用です。
このgemを使用すると、DBに保存する区分値の管理や、ビューでプルダウンリストを表示する際に使用するコレクションの生成等が一元管理出来るので重宝していたのですが、残念ながらElixirには同様な機能を持つパッケージが(私の探した限りでは)存在しませんでした。
ということで、ActiveHash::Enumと似た機能を持つ、Elixir用の区分値管理パッケージを作成してみました。
使用方法
使用方法を説明させて頂きます。READMEにも記載してありますが、まずは下記のようにモジュールを定義してみてください。
defmodule Status do
use ExEnum
row id: 0, type: :invalid, text: "this is invalid"
row id: 1, type: :valid, text: "this is valid"
accessor :type
end
このように定義した区分値を、下記のように取得することが出来ます。
Status.all
# => [%{id: 0, text: "this is invalid", type: :invalid},
# %{id: 1, text: "this is valid", type: :valid}]
Status.get(0)
# => %{id: 0, text: "this is invalid", type: :invalid}
Status.get_by(text: "this is valid", type: :valid)
# => %{id: 0, text: "this is valid", type: :valid}
Status.invalid
# => %{id: 0, text: "this is invalid", type: :invalid}
status = Status.valid
status.id
# => 1
status.text
# => "this is valid"
status.type
# => :valid
Status.get!(-1)
# => ** (RuntimeError) no result
Status.get_by!(type: :wrong)
# => ** (RuntimeError) no result
Phoenixのviewヘルパーとは下記のようにして連携可能です。
# index.html.eex
<td><%= Status.get(user.status).text %></td>
# form.html.eex
<%= select f, :status, Status.select([:text, :id]), class: "form-control" %>
# show.html.eex
<%= Status.get(@user.status).text %>
(2016/03/22追記)
Gettextに対応しました。READMEをご参照ください。
Elixirのパッケージを作ってみた感想
分かっていたことではありますが、quoteとunquoteの動作を把握するのは中々大変です。
Elixirのメタプログラミングをしっかり理解するには、最低限Metaprogramming Elixirくらいは読破しておかないといけないかもですね。