
いくつかの台風が過ぎていき、いよいよ梅雨が明けた。どこへ出かけても暑いため、私は家の庭にプールを出して次男をそこに入れた。彼は水飛沫をあげて嬉しそうに遊んでいる。しかし、監視している私はなにもすることがなく、生い茂っている雑草をむしるばかりである。暑い。
本記事の背景
副業で参画しているRailsアプリケーション開発だが、Railsをバージョン8.1にアップデートすることになった。Rails7.2はセキュリティのサポートが近々切れる。Rails8.0も同じようなものなので、ジャンプアップすることにしたようだ。Notionに書かれたIssueには、現状分析やアップデートする際に留意することが詳細に述べられており、私のようにアプリケーション自体に触る機会が少ない人でもわかりやすいようになっていた。
与えられた業務をこなすだけでも十分コーディング全般に関して力にはなるが、いかんせん私には時間がない。やったことを文章にまとめていくことで、パワーアップの速度を上げていこう。そんな気持ちでこの記事を書く。
アップデートの流れ
Railsのアップデート自体は単純である。Gemfileに記載されたRailsのバージョンを7.2から8.1に書き換えるだけだ。しかし、gemはRailsだけではない。依存関係というものがある。Rails自体を新しくすることで、ほかに導入しているgemになんらかの影響を与えることがよくある。というか、絶対何かしらある。
gemの他にもRuby自体が影響を受けることもあるが、今回はそうではなかった。
gemの更新で主だったもの
activerecord-multi-tenant
一番大きかったのはこれかもしれない。
どんなgemか
そもそもマルチテナントというのは何か。これは、ひとつのシステムを複数の顧客企業(テナント)が共同利用する方式のことだ。物理的には同じアプリケーション・同じデータベースを共有していながら、クエリに対してテナントごとの絞り込みを行うことで、他社のデータは見えない。各社にとっては、あたかも自社専用のシステムであるかのように振る舞う仕組みである。
activerecord-multi-tenant は自動で絞り込みを付与してくれるgemだが、今回のRailsアップデートでは、このgemが利用しているActiveRecordのさらに内側にあるArelというAPIについて変更点があった。
Rails8ではArel::Nodes::Function#aliasが削除されており、multi-tenant gemがそれを呼び出そうとしてもNoMethodErrorが発生した。
対応
暫定対応:config/initializers/ にモンキーパッチを置き、問題のメソッド呼び出しを回避した。
恒久対応: forkリポジトリへ修正PR提出。マージ後にパッチを削除する。
パッチの内容はすでに他のユーザーがあげているPRに近いことをした。
これがマージされればパッチを置かなくても、activerecord-multi-tenant gemを利用するだけで解決するはず。しかしまだ時間がかかりそうだ。
大切なことは、聞きながら進めるということ
他にもいろいろなgemを更新したが、すべて書いていると長くなってしまうし、次男が昼寝から起きそうだ。このあたりで締めることにする。
今回のアップデートを通して感じたのは、コーディングで大切なのは「聞きながら進める」ということだ。正直に言えば、Issueに書かれていた問題をすべて解決できたわけではない。難易度や作業量との兼ね合いで、手が届かなかった箇所も多々ある。
それでも、コードを書き始める前に優先順位を確認する。完璧でなくてもラフな段階でPRを出し、方針が合っているか早めに見てもらう。ということを行なっていった。振り返れば、進んだ距離よりも、この小さな確認の積み重ねこそが今回の一番の収穫だったのかもしれない。
オンラインかつ非同期で働く環境では、黙って完璧を目指すより、途中経過を晒しながら走るほうが、結果として速い。これは副業だからという話ではなく、本業にも通じる話。
そう思うよ。