Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

現代のRailsで不要になったgem 5+1選(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

現代のRailsで不要になったgem 5+1選(翻訳)

コンサルタントの仕事をやっていると、Railsコードベースのレビューを行うこともたびたびあります。Railsアプリの多くは、よくできた最新バージョンのRailsやRubyで開発された、まっさらなアプリ(greenfield apps)ではありません。しかし最新ではなくても、ビジネスの成功を支えてきたのです。そうしたアプリをスムーズかつ安全に運用するには、フレームワークのメンテナンス期間を過ぎてしまわないための工夫が多少なりとも必要になってきます。

アップグレードプロセスの中で、最も楽なのはRails自身のアップグレードです。フレームワークやその構成要素同士の連携はうまく取れているので、新しいフレームワークのデフォルト設定を1つずつ調整しつつ、段階的にアップグレードを進めることが可能です。

それより厄介なのは、フレームワーク以外の依存関係(訳注: 主にgemのこと)です。アプリケーションの立ち上げ時には大いに活躍してくれた依存関係たちですが、いざアップグレードの時になると、どれもこれも面倒を増やしてくれます。

  • フレームワークのバージョンが変わったときに相互作用がどう変わるか: 依存関係もアップグレードが必要か?

  • 依存関係同士はどのように相互作用しているのか: 一方が変更されたら他方もアップグレードが必要か?

  • 依存関係をアップグレードしなければならなくなったときに、振る舞いにbreaking changesが生じるか?

  • フレームワークを同じステップで変更しながら、フレームワークと切り離された形で依存関係をアップグレード可能か?

依存関係は、増えれば増えるほど問題も大きくなり、しまいには、確認しなければならない依存関係のchangelogも増える一方です。そういうgemをいくつかだけでも削除できれば大変助かるでしょう。

🔗 「もう要らないgem」リスト

不要になったgemの依存関係を見つけ出すためのヒューリスティック(発見的方法)はいろいろありますが、私が使っているのは、「フレームワークに同じ機能が既にある外部gemを置き換える」というものです。そこで、本記事では、現代のRailsで不要になった個人的なトップ5リストを紹介いたします。

🔗 1: aasm

aasm/aasm - GitHub

Railsは4.1のときからenumをサポートしているので、aasmを切り捨てるのは簡単です。しかし今になってもまだaasmが使われているのを見かけることは珍しくありません。詳しくは、同僚のSzymonが書いた、aasm gemをenumに置き換える以下の記事をご覧ください。

Rails: aasm gemは今すぐRailsの新しいenumに置き換えよう(翻訳)

🔗 2: activerecord-import

zdennis/activerecord-import - GitHub

Active Recordを一括操作で拡張してくれた素晴らしいgemでしたが、Rails 6.0以降に導入された以下の関数のおかげで、もはや不要になりました。

上の関数について、ひとつ知っておきたい重要な違いがあります。「空のコレクション」に対して適用したときの振る舞いが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として追加

basecamp/marginalia - GitHub

marginalia gemは、Rails 7.0以降でQueryLogsとして取り込まれました。
これにより、従来のMarginalia::Comment.componentsconfig.active_record.query_log_tagsとなり、Marginalia::Comment.prepend_commentconfig.active_record.query_log_tags_prepend_commentとなりました。この2つで作業はほぼ完了です。

🔗 5: attr_encrypted

attr-encrypted/attr_encrypted - GitHub

Rails 7.0から、Active Recordの属性に暗号化機能が導入されています。

attr_encryptedのときとは保存方法(保存する暗号化済みデータベースカラムの個数、命名、ペイロード)が異なるため、attr_encryptedからActive Record暗号化機能への移行は簡単ではありません。これについてはPagerTreeチームが書いたアップグレードパスをどうぞ(訳注: リンク先がなくなったようです)。

🔗 皆さんからお寄せいただいた不要gem情報

今回紹介した「現代のRailsで不要になったgem 5選」で、特に興味を惹かれたのはどのgemでしたか?読者の皆さまからお寄せいただいた不要gem情報を以下にご紹介いたします。

🔗 6: request_store

steveklabnik/request_store - GitHub

request_store gemは、Rails 5.2でActiveSupport::CurrentAttributesが導入されて以来無用になったとの情報をお寄せいただきました。inultyさん、ありがとうございます!

Happy upgrading!

関連記事

Rails: new_framework_defaultsの設定が反映されるタイミングを無邪気に信じてはいけない(翻訳)


  1. 訳注: marginaliaは書籍の欄外に置かれる注釈のことです。 

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。