現代のRailsで不要になったgem 5+1選(翻訳)
コンサルタントの仕事をやっていると、Railsコードベースのレビューを行うこともたびたびあります。Railsアプリの多くは、よくできた最新バージョンのRailsやRubyで開発された、まっさらなアプリ(greenfield apps)ではありません。しかし最新ではなくても、ビジネスの成功を支えてきたのです。そうしたアプリをスムーズかつ安全に運用するには、フレームワークのメンテナンス期間を過ぎてしまわないための工夫が多少なりとも必要になってきます。
アップグレードプロセスの中で、最も楽なのはRails自身のアップグレードです。フレームワークやその構成要素同士の連携はうまく取れているので、新しいフレームワークのデフォルト設定を1つずつ調整しつつ、段階的にアップグレードを進めることが可能です。
それより厄介なのは、フレームワーク以外の依存関係(訳注: 主にgemのこと)です。アプリケーションの立ち上げ時には大いに活躍してくれた依存関係たちですが、いざアップグレードの時になると、どれもこれも面倒を増やしてくれます。
- フレームワークのバージョンが変わったときに相互作用がどう変わるか: 依存関係もアップグレードが必要か?
-
依存関係同士はどのように相互作用しているのか: 一方が変更されたら他方もアップグレードが必要か?
-
依存関係をアップグレードしなければならなくなったときに、振る舞いにbreaking changesが生じるか?
-
フレームワークを同じステップで変更しながら、フレームワークと切り離された形で依存関係をアップグレード可能か?
依存関係は、増えれば増えるほど問題も大きくなり、しまいには、確認しなければならない依存関係のchangelogも増える一方です。そういうgemをいくつかだけでも削除できれば大変助かるでしょう。
🔗 「もう要らないgem」リスト
不要になったgemの依存関係を見つけ出すためのヒューリスティック(発見的方法)はいろいろありますが、私が使っているのは、「フレームワークに同じ機能が既にある外部gemを置き換える」というものです。そこで、本記事では、現代のRailsで不要になった個人的なトップ5リストを紹介いたします。
🔗 1: aasm
Railsは4.1のときからenumをサポートしているので、aasmを切り捨てるのは簡単です。しかし今になってもまだaasmが使われているのを見かけることは珍しくありません。詳しくは、同僚のSzymonが書いた、aasm gemをenumに置き換える以下の記事をご覧ください。
🔗 2: activerecord-import
Active Recordを一括操作で拡張してくれた素晴らしいgemでしたが、Rails 6.0以降に導入された以下の関数のおかげで、もはや不要になりました。
insert_all
(およびinsert_all!
)-
upsert_all
(およびupsert_all!
)
上の関数について、ひとつ知っておきたい重要な違いがあります。「空のコレクション」に対して適用したときの振る舞いがactiverecord-importと異なっていたのですが、これはRails 7.1で修正されました(cd35086)。
🔗 3: timecop
ActiveSupport::Testing::TimeHelpers
はRails 4.1以降で利用可能です。テストクラスにこのヘルパーをinclude
しておけば、時間に関するfreeze
メソッドやtravel
メソッドを両方とも実行可能になります。さらに、after_teardown
コールバックを使えば、特定のテストケース内でのみ時間を安全に分離してテストできるようになります。
🔗 4: marginalia1
参考: 週刊Railsウォッチ20210906: Marginalia gemがActiveRecord::QueryLogs
として追加
marginalia
gemは、Rails 7.0以降でQueryLogs
として取り込まれました。
これにより、従来のMarginalia::Comment.components
はconfig.active_record.query_log_tags
となり、Marginalia::Comment.prepend_comment
もconfig.active_record.query_log_tags_prepend_comment
となりました。この2つで作業はほぼ完了です。
🔗 5: attr_encrypted
Rails 7.0から、Active Recordの属性に暗号化機能が導入されています。
attr_encryptedのときとは保存方法(保存する暗号化済みデータベースカラムの個数、命名、ペイロード)が異なるため、attr_encryptedからActive Record暗号化機能への移行は簡単ではありません。これについてはPagerTreeチームが書いたアップグレードパスをどうぞ(訳注: リンク先がなくなったようです)。
🔗 皆さんからお寄せいただいた不要gem情報
今回紹介した「現代のRailsで不要になったgem 5選」で、特に興味を惹かれたのはどのgemでしたか?読者の皆さまからお寄せいただいた不要gem情報を以下にご紹介いたします。
🔗 6: request_store
request_store
gemは、Rails 5.2でActiveSupport::CurrentAttributes
が導入されて以来無用になったとの情報をお寄せいただきました。inultyさん、ありがとうございます!
Happy upgrading!
おたより発掘
insert_all/upsert_allは直接SQLを実行するので速度面でかなり優れていますが、validationやcallbackが実行されないのでまだactiverecord-importの需要はある印象です。あとバッチサイズも指定できますね〜 https://t.co/7lKwaRcvDF
— hikaru (@hik4_n) July 30, 2025
関連記事
Rails: new_framework_defaultsの設定が反映されるタイミングを無邪気に信じてはいけない(翻訳)
- 訳注: marginaliaは書籍の欄外に置かれる注釈のことです。 ↩
概要
元サイトの許諾を得て翻訳・公開いたします。