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

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

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

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

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

Ответ 1

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

class ApplicationController
  def skip_sql?
    params[:controller] == "..." && params[:action] == "..."
  end
end

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

module SkipSql
  module Controller
    def self.included(base)
      base.prepend_before_filter :assign_skip_sql_to_models
    end

    def assign_skip_sql_to_models
      ActiveRecord::Base.skip_sql_proc = proc {send(:skip_sql?)}
    end
  end
  module Model
    def self.included(base)
      base.extend ClassMethods
    end

    module ClassMethods
      attr_accessor :skip_sql_proc

      def skip_sql?
        ActiveRecord::Base.skip_sql_proc.call if ActiveRecord::Base.skip_sql_proc
      end

    end

    def skip_sql?
      self.class.skip_sql?
    end
  end
end

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

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

class ActiveRecord::ConnectionAdapters::MysqlAdapter
  def configure_connection
    unless skip_sql?
      encoding = @config[:encoding]
      execute("SET NAMES '#{encoding}'", :skip_logging) if encoding

      execute("SET SQL_AUTO_IS_NULL=0", :skip_logging)
    end
  end
end

Если configure_connection не работает, я попробую метод подключения следующим образом:

class ActiveRecord::ConnectionAdapters::MysqlAdapter
  alias :old_connect :connect

  def connect
    old_connect unless skip_sql?
  end

  alias :old_active? :active?

  def active?
    skip_sql? ? false : old_active?
  end
end

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