# ActiveRecord::Enumで定義された値のi18nをどう扱うか？

**URL:** <https://discourse.clean-rails.org/t/activerecord-enum-i18n/126>\
**Category:** Uncategorized\
**Created:** [2018 年 5 月 21 日午後 5:11 UTC](https://discourse.clean-rails.org/t/activerecord-enum-i18n/126 "2018-05-21T17:11:21Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![koheisg](https://discourse.clean-rails.org/user_avatar/discourse.clean-rails.org/koheisg/32/884_2.png) [@koheisg](https://discourse.clean-rails.org/u/koheisg)\
**Post date:** [2018 年 5 月 21 日午後 5:11 UTC](https://discourse.clean-rails.org/t/activerecord-enum-i18n/126/1 "2018-05-21T17:11:21Z")

</div>

いつも悩んでしまいますが、いまいちこれ！といった回答がなくて、質問します。

- model

```auto
class Book < ApplicationRecord
  enum state: {read: 0, reading: 1}
end

```

- config/locale/ja.yml

```auto
activerecord
  enum
    book
      state
       read: 読了
       reading: 読書中

```

- view(form)

```auto
<%- @books.each do |book| %>
   <p><%= t book.state, 'activerecord.enum.book.state' %></p>
<% end %>

```

- view(form)

```auto
<%= form_with(model: Book.new) do |form| =>
   <% = from.select :state, Book.states.keys.map{ |key| [t(key, 'activerecord.enum.book.state'), key] }
<% end %>

```

helperを使う、gemを使う、decoratorを使う、modelのconcernを使うなど色々方法は思い浮かびますが、  
これといって綺麗にばし！っと書く方法が浮かびません。

みなさまはどう対処されていますでしょうか？？

---

<div class="post-metadata">

**Author:** ![noguchi](https://discourse.clean-rails.org/user_avatar/discourse.clean-rails.org/noguchi/32/895_2.png) [@noguchi](https://discourse.clean-rails.org/u/noguchi)\
**Post date:** [2018 年 6 月 23 日午後 2:22 UTC](https://discourse.clean-rails.org/t/activerecord-enum-i18n/126/2 "2018-06-23T14:22:26Z")

</div>

enum\_helpというgemを入れてるのですが、今の所特に困ったりした事はなく便利に使ってます。  
simple\_formも使ってるので、フォームの表示も勝手にi18n化されます。

---

<div class="post-metadata">

**Author:** ![willnet](https://discourse.clean-rails.org/user_avatar/discourse.clean-rails.org/willnet/32/4_2.png) [@willnet](https://discourse.clean-rails.org/u/willnet)\
**Post date:** [2018 年 8 月 26 日午前 7:25 UTC](https://discourse.clean-rails.org/t/activerecord-enum-i18n/126/3 "2018-08-26T07:25:21Z")

</div>

i18n使いたいがために [enumerize](https://github.com/brainspec/enumerize) 入れるプロジェクトもありますね。もしくは @noguchi さんが書いてるように [enum\_help](https://github.com/zmbacker/enum_help) か。

個人的にはそこまでするほどでもないか、と考えて @koheisg さんが書いているように自前で頑張ってしまうことが多いです…

---

<div class="post-metadata">

**Author:** ![YoshitsuguFujii](https://discourse.clean-rails.org/user_avatar/discourse.clean-rails.org/yoshitsugufujii/32/892_2.png) [@YoshitsuguFujii](https://discourse.clean-rails.org/u/YoshitsuguFujii)\
**Post date:** [2018 年 9 月 11 日午前 10:23 UTC](https://discourse.clean-rails.org/t/activerecord-enum-i18n/126/4 "2018-09-11T10:23:48Z")

</div>

大筋一緒なんですが

私はこういうヘルパーを作って

```auto
 def options_for_select_from_enum(klass, target)
    enum_list = klass.send(target.to_s.pluralize.to_s)
    enum_list.map do |key, _value|
      [klass.human_attribute_name(key), key]
    end
  end

```

こうやって使ってます(simple\_form)

```auto
= f.input :state, collection: options_for_select_from_enum(Book, :state)

```

ちなみにransackの検索ではこう

```auto
  def options_for_select_from_enum_number(klass, target)
    enum_list = klass.send(target.to_s.pluralize.to_s)
    enum_list.keys.map { |key| klass.human_attribute_name(key) }.zip(enum_list.values)
  end

```

```auto
= search_form_for @q, :builder => SimpleForm::FormBuilder do |f|
  = f.input :state_eq, collection: options_for_select_from_enum_number(Book, :state)

```
