database.yml の query_log_tags のネストキー参照バグを修正
この PR は、database.yml に記述した query_log_tags の内部キー(format や prepend_comment)が正しく読み取られず、設定が無効になる問題を解消します。HashConfig がトップレベルキーのみをシンボル化する仕様に起因し、ネストされたハッシュは文字列キーで保持されているため、シンボルでアクセスすると nil になる点を修正します。
背景
query_log_tags のネストキーが無視されるバグ が発生していたのは、HashConfig が初期化時に @configuration_hash = configuration_hash.symbolize_keys.freeze としてトップレベルキーだけをシンボル化したためです。その結果、query_log_tags 配下の format や prepend_comment は文字列キーのまま残り、従来コードの config[:format] などのシンボル参照では取得できませんでした。この不一致により、データベースプール単位でのクエリログタグ設定がグローバル設定にフォールバックしてしまい、意図したタグ付与が行われませんでした。修正により、YAML で記述した通りのタグ設定が各プールで有効になります。
技術的な変更
HashConfig の内部アクセスを文字列キーに置き換え ました。query_log_tags_format と query_log_tags_prepend_comment メソッドで、シンボル :format / :prepend_comment の代わりに文字列キー "format" / "prepend_comment" を使用し、ハッシュが存在すればその値を取得するよう変更しています。
@@ -113,14 +113,14 @@ def query_log_tags_format # :nodoc:
return @query_log_tags_format if defined? @query_log_tags_format
config = query_log_tags_config
- @query_log_tags_format = (config[:format]&.to_sym if config.is_a?(Hash))
+ @query_log_tags_format = (config["format"]&.to_sym if config.is_a?(Hash))
end
def query_log_tags_prepend_comment # :nodoc:
return @query_log_tags_prepend_comment if defined? @query_log_tags_prepend_comment
config = query_log_tags_config
- @query_log_tags_prepend_comment = (config[:prepend_comment] if config.is_a?(Hash))
+ @query_log_tags_prepend_comment = (config["prepend_comment"] if config.is_a?(Hash))
end
テストコードも YAML 文字列での設定に合わせて更新 しています。with_db_config 呼び出しをハッシュリテラルからインライン YAML に置き換え、format: sqlcommenter や prepend_comment: true が文字列キーとして渡されることを検証しています。これにより、実際の database.yml と同様の読み取り挙動がテストで保証されます。
- with_db_config(query_log_tags: { format: "sqlcommenter" }) do |connection|
+ with_db_config(<<~YAML) do |connection|
+ query_log_tags:
+ format: sqlcommenter
+ YAML
設計判断
トップレベルのシンボル化は維持し、ネストキーのみ文字列参照へ変更 する方針が採用されました。HashConfig 全体のキー変換ロジックを変更すると、既存の設定ファイルやプラグインとの互換性リスクが高まります。一方、該当メソッドだけを文字列キーで取得するようにすれば、既存の読み取りロジックや他の設定項目への影響はありません。この最小限の変更でバグを解消し、将来的にキー変換方針を統一する余地を残した設計です。
まとめ
database.yml の query_log_tags 設定が正しく反映されるように、HashConfig がネストキーを文字列で参照するよう修正しました。コード変更は限定的で後方互換性を保持しつつ、プール単位のタグ付与機能を期待通りに動作させます。