LoginSignup
6
5

More than 5 years have passed since last update.

ActiveHash::Enumと似た機能を持つ、Elixir用の区分値管理パッケージを作ってみました。

Last updated at Posted at 2016-03-10

Railsでの区分値管理においては、下記の記事で説明されている通り、ActiveHash::Enumが非常に有用です。

ActiveHashを使ってRailsで区分値を扱う方法

このgemを使用すると、DBに保存する区分値の管理や、ビューでプルダウンリストを表示する際に使用するコレクションの生成等が一元管理出来るので重宝していたのですが、残念ながらElixirには同様な機能を持つパッケージが(私の探した限りでは)存在しませんでした。

ということで、ActiveHash::Enumと似た機能を持つ、Elixir用の区分値管理パッケージを作成してみました。

ex_enum

使用方法

使用方法を説明させて頂きます。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くらいは読破しておかないといけないかもですね。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5