Rails 7 で、スキーマ定義からモデルのファイルを生成する

概要

Rails 7 になって ActiveRecord::Schema 周りが変わって、
モンキーパッチでの method override する場所が変わったためにこのコードが動かなくなった。 対策は、

s = ActiveRecord::Schema

s = ActiveRecord::Schema[7.0]

に書き換えれば OK.

pocke さんのやつを書き換えるだけでも動くはずだし、
僕が結構書き換えたGist を使ってもらってもOK.

以下詳細。



Rails 6 までは、先人のコードが動く

Migration を Rails と別管理する必要があって、
schema.rb からモデルを生成したら便利だなーと思っていた所、

https://pocke.hatenablog.com/entry/2016/01/16/155004
にて公開されているコードでスキーマ定義からモデルが生成できました。

Rails 7 にて動かない

ところが残念な事にこのコード Rails 7 で動かなくなりました。
むしろ rails db::schema:load みたいな挙動になってしまいました。

この理由はソースコードを見て推測しました。

https://github.com/rails/rails/blob/6-1-stable/activerecord/lib/active_record/schema.rb#L13
https://github.com/rails/rails/blob/7-0-stable/activerecord/lib/active_record/schema.rb#L13

二つを比べると、コメントで

ActiveRecord::Schema.define do
...
end

ActiveRecord::Schema[7.0].define do
...
end

に変わっていたので、そのせいだと推測し、冒頭に紹介した変更を加えると無事動きました。
なお力不足で、ソースコードから ActiveRecord::Schema[7.0].define
となっている実体は理解できませんでした。