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

Чтобы отследить некоторые проблемы с производительностью, я пытаюсь создать страницу, которая визуализируется с помощью платформы 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 Ответ

13 голосов
/ 08 февраля 2011

Единственный способ обойти это - переопределить функцию 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

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

...