patorashのブログ

方向性はまだない

メタプログラミングでActiveRecord::Enumの値についてカラムにコメントする

前回はI18nのデータを元にコメントを追加するというやつを書きました。

patorash.hatenablog.com

今回は、さらに踏み込んで、ActiveRecord::Enumの値が何を示しているのかを、メタプログラミングを使ってコメント化しました。

なお、プロジェクトではgem enum_helpを使っているため、それを前提とします。enum_helpは、enumの値からI18n対応した文言を取得するのを楽にするgemです。

github.com

マイグレーションファイルを作る

とりあえず生成。

bin/rails g migration AddColumnCommentFromEnum

書いていく

gistから貼り付けておきます。

肝は、I18nenumの定義のないテーブルはさっさとnextでスキップして、ある場合はカラムの定義毎にenumI18nの定義があるか確認して、なければnextでスキップして…というふうにしてループの回数を減らしてます。 enum_help用のI18nのデータがあるカラムが見つかったら、

  1. テーブル名からクラスを取得
  2. sendメソッドにカラムの複数形にしたものを渡して、enumの定義を取得(例えば、User.rolesを取りたくてUser.send("role".pluralize)する)
  3. enumの日本語の定義と数値の定義の配列を生成する。
  4. ハッシュに変換、キーと値の入れ替え後、文字列化

というのをしてます。後半のやつは普通に最初からそういうデータ作ってもよかったな…。simple_form対応しているコードからコピペしてきたからこうなっただけです。

Add column comment from ActiveRecord::Enum. with …

実行する

いざ、実験。

bin/rails db:migrate

プロジェクトでは、gem annotateを使っていて、モデルのファイルの先頭にテーブル定義がコメントで追加されています。それのコメントを見ていきます。

Before

どの値が何の状態を表すかわかりません…😢

#  status(ステータス)              :integer          default("accepted"), not null

After

どの値が何の状態を示すか、バッチリわかるようになりました👍

#  status(ステータス:{0=>"受付済", 1=>"処理中", 2=>"完了", 3=>"失敗"}) :integer          default("accepted"), not null

まとめ

enumを使っているカラムの説明を1つずつ書いていくのは大変そうだったので、メタプログラミングで解決できてよかったです😀