LoginSignup
0
0

More than 1 year has passed since last update.

【初心者向け】ActiveRecord::Enumの使い方

Last updated at Posted at 2022-02-02

ActiveRecord::Enumとは

ActiveRecordが提供しており、列挙型もしくはenum型と呼ばれます
enum型は数値カラムをプログラム上で別名を使って扱うことができます

どういうときに使うのか

例えば、Productモデルに販売状況カラム(完売、販売中、予約中)を追加するときなど、カラム値のパターンが少ない場合に使います。

使うための準備

  • カラム作成
  • 名称を定義
  • ja.yml設定

カラム作成

enum設定したい数値型のカラムを作成します

ターミナル
bin/rails g migration AddStatusToProduct status:integer
bin/rails db:migrate

名称を定義

以下のように記述すると、
ハッシュのようにシンボルと値を紐付けることができます

app/model/product.rb
enum status: { sold_out: 0, sale: 1, reservation: 2 }

ja.yml設定

デフォルト言語を日本語に設定

config/application.rb
  class Application < Rails::Application
    config.i18n.default_locale = :ja
  end

翻訳ファイルを編集

config/locales/ja.yml
ja:
  enums:
    product:
      status:
        sold_out: '完売'
        sale: '販売中'
        reservation: '予約中'

便利なメソッド

確認メソッド

以下のようにenumの値を確認することが可能です

ターミナル
product = Product.new(name: "pen", status: :sold_out)

product.sale? #statusがsaleか
=> false

product.sold_out? #statusがsold_outか
=> true

更新メソッド

以下のようにenumの値を更新することが可能です

ターミナル
product = Product.new(name: "pen", status: :sold_out)

product.sale?
=> false

product.sold_out! #statusをsold_outに更新

product.sold_out?
=> true

日本語で表示

viewの場合

app/controller/products_controller.rb
def show
  @product = Product.find(1)
end
app/view/products/show.html.erb
# tメソッドはja.ymlを参照し、翻訳した値を返却します
<%= t("enums.product.status.#{@product.status}") %>

本来、tメソッドの頭に「I18n」 を付ける必要があるのですが、railsガイド(https://railsguides.jp/i18n.html) で以下のように説明されています。

Railsはt(translate) ヘルパーメソッドを自動的にビューに追加するので、I18n.tのようにフルスペルで書かずに済みます。

ターミナルの場合

ターミナル
I18n.t("enums.product.status.sold_out")

参考

0
0
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
0
0