プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Ruby on Rails】「Enum」について
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Ruby on Rails】「Enum」について

11.17

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

Enumとは?

Rails4.1から使えるようになった「ActiveRecord::Enum」というモジュールのことです。

実装方法

対象カラム

integer型のカラムが対象になります。

モデルクラス

下記のように対象からむにenumを定義します。

1
2
3
class User < ApplicationRecord
  enum 対象カラム名: [ :設定値1, :設定値2 ]
end

設定値1には「0」、設定値2には「1」というように前から順番に設定値に紐づく値が設定されていきます。

値を入れてみる。

1
User.create(gender:0,name:"次郎")

rails consoleで確認すると下記のように指定すると数値ではなく設定値が帰って来ます。(なお、データベースにはちゃんと数値が挿入されているのでご心配なく!)

1
2
3
>> User.find(2).gender
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
=> "male"

下記のようにカラム名に「s」をつけてあげるとHashを取得できます。

1
2
>> User.genders
=> {"male"=>0, "famale"=>1}

Enumerize

enumと似たようなことができますが、機能豊富なGemで実際に開発現場でもよく使われています。

メリット

Enumに比べると具体的に下記のようなメリットがあります。

  • デフォルトでi18n対応
  • デフォルト値設定
  • scope名設定の柔軟さ

実例

下記のようにモデルに対して「extend Enumerize」を記述します。

1
2
3
4
5
class User < ApplicationRecord
  extend Enumerize
 
  enumerize :gender, in: { male: 0, famale: 1 }
end

下記のように記述すれば、値を取得できます。(DBにはintegerの値が入っていますが、integerに対応する値を取得できます。)

1
2
3
4
>> User.find(7).gender
   (0.7ms)  SELECT sqlite_version(*)
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 7], ["LIMIT", 1]]
=> "famale"

数値を取得したい場合は下記のように「_value」を付けます。

1
2
3
>> User.find(7).gender_value
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 7], ["LIMIT", 1]]
=> 1

デフォルト値

下記のようにdefaultを指定することでデフォルト値を設定することが可能です。(例で言えば「male」)、Rails標準のenumで実装しようとしたらマイグレーションの中でデフォルト値を指定する必要がある。

1
2
3
4
5
class User < ApplicationRecord
  extend Enumerize
 
  enumerize :gender, in: { male: 0, famale: 1 },default: :male
end

i18n対応

標準のenumで対応しようとしたら「enum_help」を使わないといけません。

config/locales/ja.yml

1
2
3
4
5
6
ja:
  enumerize:
    user:
      gender:
        male: 男
        famale:  女

翻訳された文字を取得したい場合は下記のように「_text」を付けます。

1
2
3
>> User.find(2).gender_text
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
=> "男"

スポンサーリンク
  • 2020 11.17
  • miyabisan2
  • コメントを書く
  • Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2019 12.08

    【Ruby on Rails】「Turbolinks」によるページ遷移高速化

  2. 2020 10.13

    【Ruby on Rails】「pundit」について

  3. 2019 12.03

    【Ruby on Rails】アセットパイプラインについて

  4. 2019 12.01

    【Ruby on Rails】URLの指定方法について(URLヘルパーメソッド等)

  5. 2019 12.07

    【Ruby on Rails】「Active Job」でジョブを非同期実行する。(Sidekiq)

  6. 2019 12.02

    【Ruby on Rails】RailsでのAjaxリクエスト(rails-ujs、SJRなど)

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Ruby on Rails】「主キー」、「複合キー」…

【Ruby on Rails】「devise」の基本ク…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー