`dbconsole` の NotImplementedError メッセージに誤ったクラス名が表示される不具合を修正
AbstractAdapter.dbconsole が発生させる NotImplementedError のメッセージに、アダプタークラス名ではなく Class という文字列が表示される不具合を修正しました。クラスメソッド内での self と self.class の違いを踏まえた1行の変更で、エラーメッセージの可読性を正しい状態に戻しています。
背景
#54719 は、AbstractAdapter における NotImplementedError のメッセージを明示的なものにした改善PRです。カスタムDBアダプターを実装する際、どのメソッドを定義すべきかが一目でわかるようにするためのもので、クラス名を文字列補間でエラーメッセージに埋め込むパターンを採用しました。
しかし、dbconsole は クラスメソッド(def self.dbconsole)であるにもかかわらず、インスタンスメソッドで用いられる self.class のパターンがそのまま適用されていました。クラスメソッド内での self はクラス自身(例: ActiveRecord::ConnectionAdapters::AbstractAdapter)を指しますが、self.class はそのクラスの「クラス」、すなわち Class を返します。この違いにより、意図したアダプタークラス名ではなく Class という無意味な文字列がエラーメッセージに埋め込まれていました。
技術的な変更
abstract_adapter.rb の dbconsole クラスメソッド内で、NotImplementedError メッセージの文字列補間を #{self.class} から #{self} に変更しました。
変更前:
def self.dbconsole(config, options = {})
raise NotImplementedError.new("#{self.class} should define `dbconsole` that accepts a db config and options to implement connecting to the db console")
end
変更後:
def self.dbconsole(config, options = {})
raise NotImplementedError.new("#{self} should define `dbconsole` that accepts a db config and options to implement connecting to the db console")
end
この変更により、エラーメッセージの出力は以下のように変わります。
変更前:
NotImplementedError: Class should define `dbconsole` ...
変更後:
NotImplementedError: ActiveRecord::ConnectionAdapters::AbstractAdapter should define `dbconsole` ...
設計判断
self と self.class の使い分けは、メソッドの種別(インスタンスメソッドかクラスメソッドか)に依存するという基本的なルールに基づいた修正です。
インスタンスメソッドでは self はインスタンスを指すため、クラス名を得るには self.class が正しい表現です。一方、def self.dbconsole のようなクラスメソッドでは、self はそのクラス自身を指します。#54719 でインスタンスメソッドのパターンをクラスメソッドにそのまま流用したことで、このコンテキストの違いが見落とされていました。
修正はコードの意図を変えるものではなく、既存のエラーメッセージの誤りを正すのみです。動作への影響はなく、エラーメッセージの文字列のみが変化します。
まとめ
本PRは、クラスメソッドとインスタンスメソッドで self の指すものが異なるという基礎的な挙動の見落としによるリグレッションを修正したものです。カスタムアダプター実装者がエラーに直面した際に、どのクラスで何を実装すべきかを正確に示せるようになり、#54719 が本来目指したデバッガビリティの向上が正しく機能するようになります。