#ActiveRecord::Enumとは
ActiveRecordが提供しており、列挙型もしくはenum型と呼ばれます
enum型は数値カラムをプログラム上で別名を使って扱うことができます
#どういうときに使うのか
例えば、Productモデルに販売状況カラム(完売、販売中、予約中)を追加するときなど、カラム値のパターンが少ない場合に使います。
#使うための準備
- カラム作成
- 名称を定義
- ja.yml設定
##カラム作成
enum設定したい数値型のカラムを作成します
bin/rails g migration AddStatusToProduct status:integer
bin/rails db:migrate
##名称を定義
以下のように記述すると、
ハッシュのようにシンボルと値を紐付けることができます
enum status: { sold_out: 0, sale: 1, reservation: 2 }
##ja.yml設定
###デフォルト言語を日本語に設定
class Application < Rails::Application
config.i18n.default_locale = :ja
end
###翻訳ファイルを編集
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の場合
def show
@product = Product.find(1)
end
# 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