Rails - как мне сделать запрос, который вообще не попадает в базу данных?

Чтобы отследить некоторые проблемы с производительностью, я пытаюсь создать страницу, которая визуализируется с помощью инфраструктуры Rails (2.3.8), но не делает никаких обращений к базе данных.

Я хочу, чтобы запрос проходил через типичное промежуточное программное обеспечение (rout.rb > controller > view), в отличие от рендеринга простой статической страницы (например, 404.html), и в нем должно работать, когда сервер db выключен (веб-сервер). Все еще работает). Фактически отображаемая страница представляет собой простую HTML-страницу, отображающую время валюты с использованием erb. Прямо сейчас я получаю сообщение об ошибке при выключении базы данных, и я вижу 2 запроса, которые все еще сделаны:

SQL (0.1ms)   SET NAMES 'utf8'
SQL (0.1ms)   SET SQL_AUTO_IS_NULL=0

Любая идея, как полностью переопределить БД при выполнении этого запроса? Благодарю.

1 ответ

Решение

Единственный способ обойти это - переопределить функцию configure_connection в ActiveRecord. Для этого я бы порекомендовал сделать функцию ApplicationController с именем skip_sql? чтобы проверить, хотите ли вы пропустить функцию configure_connection для некоторых комбинаций контроллера #action:

класс ApplicationController
  def skip_sql?
    params[:controller] == "..." && params[:action] == "..."
  конец
конец

Затем сделайте эту функцию доступной для ваших классов и моделей:

модуль SkipSql
  Контроллер модуля
    def self.included(base)
      base.prepend_before_filter:assign_skip_sql_to_models
    конец

    def assign_skip_sql_to_models
      ActiveRecord::Base.skip_sql_proc = proc {send(:skip_sql?)}
    конец
  конец
  Модель модуля
    def self.included(base)
      base.extend ClassMethods
    конец

    модуль ClassMethods
      attr_accessor:skip_sql_proc

      def skip_sql?
        ActiveRecord::Base.skip_sql_proc.call, если ActiveRecord:: Base.skip_sql_proc
      конец

    конец

    def skip_sql?
      self.class.skip_sql?
    конец
  конец
конец

Object.send:include, SkipSql::Model::ClassMethods
ActionController::Base.class_eval {include SkipSql::Controller}

Тогда пропускайте sql только на установленных вами комбинациях контроллера #action:

класс ActiveRecord::ConnectionAdapters::MysqlAdapter
  def configure_connection
    разве skip_sql?
      encoding = @config[:encoding]
      выполнить ("SET NAMES '#{encoding}'",:skip_logging), если кодирование

      выполнить ("SET SQL_AUTO_IS_NULL=0",:skip_logging)
    конец
  конец
конец

Если configure_connection one не работает, я бы попробовал метод connect следующим образом:

класс ActiveRecord:: ConnectionAdapters:: MysqlAdapter
  псевдоним: old_connect: connect

  Def Connect
    old_connect разве skip_sql?
  конец

  псевдоним:old_active?: Активный?

  дефи активен?
    skip_sql?? false: old_active?
  конец
конец

Я считаю, что метод connect вызывается до того, как будет настроен метод connect, поэтому он должен помочь с проблемой сокета.

Другие вопросы по тегам