Railsコンソールでクエリキャッシュをデフォルトで無効化

rails/rails

Rails 8.1では、rails console実行時のActive Recordクエリキャッシュがデフォルトで無効になりました。これにより、コンソールでのクエリ結果が常に最新のデータベース状態を反映するようになります。

背景

#56297のマージ後、Railsコンソールではデフォルトでクエリキャッシュが有効になっていました。しかし、これが#56473で報告された問題を引き起こしていました。

コンソールでの対話的な作業では、同じクエリを複数回実行して結果の変化を確認することが一般的です。クエリキャッシュが有効だと、データベースの状態が変わっても古いキャッシュ結果が返されるため、開発者が混乱する原因となっていました。

技術的な変更

新しいコマンドラインオプション

--query-cache(エイリアス:-q)オプションが追加されました:

class_option :query_cache, type: :boolean, aliases: "-q", default: false,
  desc: "Enable the Active Record query cache for the session (ignored if --skip-executor or -w is used)"

クエリキャッシュの無効化処理

コンソール起動時に、Executorラップが有効で--query-cacheオプションが指定されていない場合、すべてのコネクションプールのクエリキャッシュを無効化します:

def perform
  # ...
  wrap_with_executor = !options[:skip_executor]
  conditional_executor(wrap_with_executor, source: "application.console.railties") do
    disable_query_cache_in_console! if wrap_with_executor && !options[:query_cache]
    Rails::Console.start(Rails.application, options)
  end
end

private
  def disable_query_cache_in_console!
    return unless defined?(ActiveRecord::Base)

    ActiveRecord::Base.connection_handler.each_connection_pool.select(&:query_cache_enabled).each(&:disable_query_cache!)
  end

この実装により、クエリキャッシュが有効なコネクションプールのみを対象にdisable_query_cache!を呼び出しています。

使用方法

デフォルト動作(クエリキャッシュ無効)

bin/rails console

この場合、クエリは常にデータベースに対して実行されます。

クエリキャッシュを有効にする

bin/rails console --query-cache
# または短縮形
bin/rails console -q

設計判断

Executorとの連携

--skip-executorオプションが指定された場合、--query-cacheオプションは無視されます。これは、Executorがクエリキャッシュのライフサイクル管理を担っているためです。Executorなしでクエリキャッシュを制御することは技術的に困難であり、予期しない動作を引き起こす可能性があります。

オプトアウト設計

従来の「デフォルトで有効」から「デフォルトで無効(オプトイン)」に変更されています。これは、コンソールでの主要なユースケース(データの確認とデバッグ)において、キャッシュによる混乱を避けることを優先した判断です。パフォーマンスが重要なバッチ処理などでは、明示的に--query-cacheを指定することで最適化できます。

コネクションプール単位の制御

実装ではeach_connection_poolを使用して、すべてのコネクションプールを対象にクエリキャッシュを無効化しています。これにより、マルチデータベース構成でも一貫した動作が保証されます。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

ガイドライン準拠 ✓ PASS

記事構成とDiffDaily Styleへの準拠状況

記事構成の必須要素(Title, Context, Technical Detail)がすべて含まれており、Design Insightも記載されています。カスタムMarkdown構文(ファイル名付きコードブロック、GitHubリンク)も正しく使用されており、ガイドラインを完全に遵守しています。

  • 記事構成(Title、Context、Technical Detail)
  • DiffDaily Styleガイド準拠
  • カスタムMarkdown活用
  • 対象読者への適合性
技術的整合性 ⚠ WARNING

技術的な正確性と表現の適切性

Diff情報が提供されていないため、記事内のコード引用と元の差分との完全な照合はできませんでした。しかし、引用されているコードは構文的に正しく、記事の説明とも技術的な整合性が取れています。技術用語も正確に使用されています。

  • 技術用語の正確性
  • コード例の正確性
  • 説明の技術的正確性
PR内容との整合性 ⚠ WARNING

元のPR情報との一致度

PRのDescription情報が提供されていないため、「背景」や「設計判断」セクションの記述について完全な裏付けができませんでした。しかし、PRタイトルから妥当に推測できる内容であり、技術的にもっともらしい説明です。明らかなハルシネーションや情報の矛盾は見つかりませんでした。

  • タイトル・説明の一致
  • Diff内容の正確な反映
  • 推測の排除