前回はI18nのデータを元にコメントを追加するというやつを書きました。
今回は、さらに踏み込んで、ActiveRecord::Enumの値が何を示しているのかを、メタプログラミングを使ってコメント化しました。
なお、プロジェクトではgem enum_helpを使っているため、それを前提とします。enum_helpは、enumの値からI18n対応した文言を取得するのを楽にするgemです。
マイグレーションファイルを作る
とりあえず生成。
bin/rails g migration AddColumnCommentFromEnum
書いていく
gistから貼り付けておきます。
肝は、I18nでenumの定義のないテーブルはさっさとnext
でスキップして、ある場合はカラムの定義毎にenumでI18nの定義があるか確認して、なければnext
でスキップして…というふうにしてループの回数を減らしてます。
enum_help用のI18nのデータがあるカラムが見つかったら、
- テーブル名からクラスを取得
- sendメソッドにカラムの複数形にしたものを渡して、enumの定義を取得(例えば、
User.roles
を取りたくてUser.send("role".pluralize)
する) - enumの日本語の定義と数値の定義の配列を生成する。
- ハッシュに変換、キーと値の入れ替え後、文字列化
というのをしてます。後半のやつは普通に最初からそういうデータ作ってもよかったな…。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つずつ書いていくのは大変そうだったので、メタプログラミングで解決できてよかったです😀