スリ飯屋MaLankaのフリーエンジニアな日々

このブログでは、フリーランス6期目となる自身の実体験から、フリーランスエンジニアになるためのノウハウ、ブログや沖縄移住、スリランカの最新情報について発信します。

【Rails】enum型でカラム名を定義すると、scopeが自動生成される

※提携先の広告(リンク、バナー等)を含む場合があります

【Rails】enum型でカラム名を定義すると、scopeが自動生成される


こんにちは、現役沖縄フリーランスエンジニアのmah(MaLanka)です。


このブログでは、

僕がIT未経験から約1年でフリーランスエンジニアになるまでの過程、

ノウハウなどを書いていきます。


今回は、


  • 【Rails】enum型でカラム名を定義すると、scopeが自動生成される


です。


【Rails】enum型でカラム名を定義すると、scopeが自動生成される


概要


enum型でカラム名を定義すると、scopeが自動生成されます。


enumで定義したカラム名はそのまま、

モデル.enumで定義したカラム名

のようにする事ができます。


なので、

enumで定義したカラム名のscopeは自分で定義する必要はありませんし、

当然、whereを使う必要もありません。



enum status: { deleted: -1, left: 0, real: 1 }, _prefix: true

というenumを定義している場合。


Hoge.status_deleted
Hoge.status_left
Hoge.status_real

のように検索出来ます。


検証


Railsコンソールで確認します。

irb(main):004:0> Hoge.status_deleted
# リレーションオブジェクトが返る。
=> #<ActiveRecord::Relation [#<Hoge id: 4, name: "hoge", status: 'deleted']


上記は、下記と同じです。

Hoge.where(status: :real)
Hoge.where(status: :left)
Hoge.where(status: :deleted)


whereで条件指定しなくて良くなったのでスッキリ書けますね。


おまけ


レシーバがインスタンスの場合、

定義したenumの名称で論理値の判定や更新が出来ます。


何らかのインスタンス.status_deleted? => 論理値を返す
何らかのインスタンス.status_deleted! => statusをdeletedに更新する


以上です。


参考リンク


Rails5 から enum 使う時は_prefix(接頭辞)_suffix(接尾辞)を使おう #ActiveRecord - Qiita