0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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")

#参考
https://pikawaka.com/rails/enum

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?