Railsでclass_methods do
Railsアプリの設計が気になってOSSを読んで勉強している。
fizzyを読んでて学んだことをメモ。
あるモデルが肥大化してきて、クラスメソッドをファイル分割をしたくなったときどうするかでいうと、私はservice classなどの別classを新しく作る方法しか頭になかったが、fizzyではconcernを使ってclass_methods doでクラスメソッドを定義している箇所がかなりある。
例えばここ。
https://github.com/basecamp/fizzy/blob/main/app/models/board/publishable.rb#L9C3-L13
class_methods do
def find_by_published_key(key)
Board::Publication.find_by!(key: key).board
end
end
このメソッドはボードを公開共有したときにkeyからボードを引いてくるメソッドだが、これをconcernの中で定義している。
けど 私の知識だとconcernは共通化のために使うものだけど、上のコードの例みたいなのだと単に静的メソッドぽくつかっており、このconcernはBoardモデルから使うことしか想定していない。単一model用concernだ。 service classに分けると、modelのメソッドとして呼ぶのとは別になるのでどのインスタンスにどのメソッドがあるかみたいなのがカオスになりがちなので、このやり方は結構いいと思った。
また、LLMがclass_methods doを使ったコードを生成するのも見たことがない。既存のコードの中にそういうパターンがないから生成しない可能性もあるけど、
LLMに任せるだけだとこのようには書かない、みたいなパターンがある気がする。すぐに取り入れたいというわけじゃないけど、いろんなコードを読むようにしていきたい。