10

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

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

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

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

ответ

13

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

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

+1

Ничего себе, спасибо. Я попробовал, но я получаю сообщение об ошибке «Не могу подключиться к локальному серверу MySQL через сокет», когда я отключу сервер базы данных и сделаю этот запрос. Когда сервер db включен, теперь я получаю 'skip_logging', где' SQL' ранее был на выходе, который я дал выше. Я буду продолжать играть с ним, если вы не думаете, что я делаю что-то неправильно. еще раз спасибо! – sa125

+1

Эй, дайте метод соединения выстрелом. Я добавил код для этого тоже. Убедитесь, что это находится в вашем config/initializers или autoload_once_path, так как вы не захотите повторно загружать этот код в процессе разработки. –

+1

Хотелось бы, чтобы я смог ответить на ваш ответ во второй раз. Я уверен, что это может сделать хороший плагин. – Jean