Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?

More than 5 years have passed since last update.

@poly_soft

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

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くらいは読破しておかないといけないかもですね。

5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What is going on with this article?