【Rails 7.1】ActiveRecord#Enumでメソッドの自動生成を制御する

この記事は GMOアドマーケティング Advent Calendar 2023 4日目の記事です。

はじめに

こんにちは。 GMOアドマーケティングの石丸です。

昨年のアドベントカレンダーでは Rails 7 で追加された ComparisonValidator について紹介しました。

この記事は GMOアドマーケティング Advent Calendar 2022 3日目の記事です。はじめにこんにちは。GMOアドマーケティングの石丸(@thomi40)です。前回の記事では Rails 7 から実装された query_log_tags について紹介しました。今回の記事では同じく Rails 7 から追加された ComparisonValidator について紹介します。※記事内の画像は筆者が作成したアプリケーションをキャプチャーしたものです。ComparisonValidatorとはComparisonValidator は任意のオブジェクトの比較を行うバリデーターです。数値の比較には NumericalityV...


2023年10月に Rails 7.1 がリリースされたため、今回の記事では Rails 7.1 から新たに追加された ActiveRecord#Enum のオプション instance_methods について解説します。

概要

ActiveRecord#Enum はデータ取得や更新のためのメソッドが自動で生成されますが、Rails 7.1 で導入された instance_methods オプションに false を設定することで、メソッドの生成を無効にすることが可能です。
このオプションにより、既存のメソッド名との競合を避けることができ、必要に応じてより明示的なメソッド名を宣言することが可能になります。

検証用の環境作成

実際の動作を確認するため、Rails 7.1の環境を構築し、User モデルに status の enum を定義してダミーのデータを生成しました。
今回はRails 7.1.2, Ruby 3.2.2の環境で構築しました。

ActiveRecord#Enumの動作確認

基本動作の確認

まずは enum が自動で生成したメソッドの動作を確認してみましょう。
デフォルトでは active?inactive? といったメソッドが自動で生成されます。

instance_methodsオプション

続いて instance_methods: false を設定して挙動を確認してみましょう。

active?inactive?NoMethodError となり、メソッドが生成されてないことが確認できました。

scopesオプション

似たようなオプションで scopes: false がありますが、こちらは名前の通りデフォルトで生成されるscopeを無効にするオプションです。

scopes: false を設定して挙動を確認してみます。

デフォルトのscopeが無効になり、 NoMethodError となることが確認できました。

まとめ

今回はRails 7.1で追加された ActiveRecord#Enuminstance_methods オプションについて紹介しました。

自動でメソッドやスコープが用意されることは便利なケースもありますが、プロジェクトによっては競合が発生することや、より明示的なメソッド名を定義したいケースがあるため、今回紹介したオプションを活用することで、より管理しやすいアプリケーションを構築することができるでしょう。

ActiveRecord#Enum には prefixsuffix といったオプションも用意されているため、それぞれのオプションを組み合わせることでコードの可読性を高めることができる場合があるため、それぞれの環境に合わせてカスタマイズするとよいと思います。

参考リンク

option to disable all methods that ActiveRecord.enum generates by alfie-max · Pull Request #46490 · rails/rails (参照日: 2023年11月15日)

告知

明日はharuさんによる「【Git】新規ローカルブランチ作成時に自動でFirst Commitを行う for Four Keys」です。
引き続き、GMOアドマーケティング Advent Calendar 2023 をお楽しみください!

■採用ページはこちら!
https://recruit.gmo-ap.jp/

■GMOアドパートナーズ 公式noteはこちら!
https://note.gmo-ap.jp/