Spec-Zone.ru › Ruby on Rails 8.1

module ActiveRecord::QueryLogs

Журналы запросов Active Record

Автоматически добавляет к SQL-запросам комментарии с тегами, содержащими информацию о времени выполнения. Это можно использовать, чтобы отследить проблемные SQL-инструкции до кода приложения, который их сформировал.

Журналы запросов можно включить с помощью конфигурации Rails в config/application.rb или в инициализаторе:

config.active_record.query_log_tags_enabled = true

По умолчанию записываются название приложения, имя и действие контроллера или название задания. Используется формат SQLCommenter. Теги, отображаемые в комментарии к запросу, можно настроить с помощью конфигурации Rails:

config.active_record.query_log_tags = [ :application, :controller, :action, :job ]

Active Record определяет теги, доступные по умолчанию:

  • application

  • pid

  • socket

  • db_host

  • database

  • source_location

ПРЕДУПРЕЖДЕНИЕ: вычисление source_location запроса может быть медленным, поэтому при использовании в производственной среде следует учитывать влияние на производительность.

См. также config.active_record.verbose_query_logs.

При загрузке Action Controller добавляет теги по умолчанию:

  • controller

  • action

  • namespaced_controller

При загрузке Active Job добавляет теги по умолчанию:

  • job

Новые теги комментариев можно определить, добавив их в Hash массива тегов Array. Теги могут содержать динамические данные: для этого задайте значение Proc или lambda в Hash. Теги могут ссылаться на любое значение, хранящееся в объекте context Rails. Для хранения значений приложения можно использовать ActiveSupport::CurrentAttributes. Теги со значениями nil не добавляются в комментарий к запросу.

Строка, возвращаемая функцией, экранируется, однако не следует использовать недоверенные пользовательские данные.

Пример:

config.active_record.query_log_tags = [
  :namespaced_controller,
  :action,
  :job,
  {
    request_id: ->(context) { context[:controller]&.request&.request_id },
    job_id: ->(context) { context[:job]&.job_id },
    tenant_id: -> { Current.tenant&.id },
    static: "value",
  },
]

По умолчанию название приложения, имя и действие контроллера или название задания записываются в формате SQLCommenter. Это можно изменить с помощью config.active_record.query_log_tags_format

Комментарии с тегами можно добавлять в начало запроса:

config.active_record.query_log_tags_prepend_comment = true

В приложениях, где содержимое не меняется в течение запроса или выполнения задания, теги можно кэшировать и повторно использовать для каждого запроса:

config.active_record.cache_query_log_tags = true

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API