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