1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

モデルにテーブル定義をコメントしてくれるgem、annotateが動作しない

Last updated at Posted at 2021-02-10

Rails の開発お役立ち gem として有名な annotate_models.
rails db:migrate した時に自動的にモデルの頭のところに対応するテーブル定義をコメントで追加してくれるアレです。この動作のことってアノテーティングと言うようですね。
とても便利なので重宝しているんですが、導入済みのプロジェクトでいつの間にか動かなくなっていました。最近テーブル定義の変更やっていなかったんで気付きませんでしたが、アレ?何かやったかな?

結論を言うとこれは annotate_models のデフォルトの挙動が変わったため。バージョンが2.7.xまでと3.1.x以上で異なっているので、古いバージョンから使っていた人はこの問題に直面します。
理由と対処法も公式にちゃんと書いてあります。

Upgrading to 3.X and annotate models not working?

In versions 2.7.X the annotate gem defaulted to annotating models if no arguments were passed in. The annotate gem by default would not allow for routes and models to be annotated together.

まあ、要するにデフォルトでモデルへアノテーティングするのをやめているんですね。ちゃんと model にアノテーティングする、と言う引数を与えるなり設定を追加するなりをやる必要が出てきたんです。
なのでこの解決策は簡単。

すでにこの gem を使っていた方なら、lib/tasks/auto_annotate_models.rake が存在するでしょう。ここに model の設定を追加します。

lib/tasks/auto_annotate_models.rake
    :
    Annotate.set_defaults(
      'routes'                  => 'false',
      'models'                  => 'true',  # <- 追加
      'position_in_routes'      => 'before',
      'position_in_class'       => 'before',
       :

このあと rails db:migrate を実行すれば、無事にモデルに対してアノテーティングが実行されるようになります。

なお、これも公式に記載がありますが、gem インストール時に実行する rails g annotate:install をもう一度実行することで lib/tasks/auto_annotate_models.rake を再生成することができます。3.x 以上のバージョン用にデフォルト設定を組み込んだもので再生成されるので、他に足りない設定項目がないか不安な方は、こちらを実行しても良いでしょう。
ただしこの場合、既存の設定項目のうちご自身で変更していたものを、再生成後に最適用する必要があります。
また、classified_sort のデフォルトが false から true に変更されているため、改めて rails db:migrate を実行すると追加されるカラムの並びが違ってしまって戸惑うかもしれません。こちらも false に設定しておくと良いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?