search
LoginSignup
55

More than 5 years have passed since last update.

posted at

updated at

Organization

ActiveRecord::Enum の使いドコロ

背景

Rails 4.1 より ActiveRecord::Enum が利用可能となりました。
これにより以下の様な記述が可能となります。

class User < ActiveRecord::Base

  enum role: [:general, :admin]

  ...
end

# role が admin なユーザを取得する
user = User.admin.first!

# admin かどうか
user.admin?

# role を確認
user.role # => "general"

# role を admin に変更
user.admin!

# role の取りうる値を確認
User.roles # => {"general"=>0, "admin"=>1}

これまで区分値として保持していた値が簡単に管理できるようになってハッピーです。

問題

しかし、これらの値を form 経由で変更しようとするとややこしいことになります。

= simple_form_for @user, ... do |f|
  = f.input :role, collection: User.roles
  = f.input :name
  • submit で ArgumentError
  • i18n はどうする?

原因

(今のところ)ActiveRecord::Enum は内部的に利用する値のために設計されているみたい。

対応案

案1: コアの対応待ち

ActiveRecord::Enum は内部で利用する項目にのみ利用し、
ユーザからの変更には使わない。(≒View を通じて変更しない)

使いドコロがちょっと難しいですね。

コアで対応するかも未定なようです。

案2: enum_help を利用する

enum_help を使うと form の問題も i18n の問題も解決します。

参考

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
What you can do with signing up
55