10

Para rastrear algunos problemas de rendimiento, intento crear una página que se represente a través del framework Rails (2.3.8) pero no realice llamadas de ningún tipo a la base de datos.Rieles: ¿cómo puedo hacer una solicitud que no llega a la base de datos?

Quiero que la solicitud pase por el middleware típico (routes.rb> controller> ver), en lugar de mostrar una página estática simple (como 404.html), y debe funcionar cuando el servidor db se active apagado (servidor web aún en ejecución). La página renderizada real es una página html simple que muestra la hora de la divisa usando erb. En este momento me sale error cuando apago la base de datos, y puedo ver 2 consultas que todavía se hacen:

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

alguna idea de cómo reemplazar el db por completo al hacer esa petición? Gracias.

Respuesta

13

La única forma de evitarlo es anulando la función configure_connection en ActiveRecord. Para hacer esto, recomendaría hacer una función ApplicationController llamada skip_sql? para probar si desea omitir la función configure_connection para algunas combinaciones acción del controlador #:

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

A continuación, realice esta función a disposición de sus clases y modelos:

 
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} 

A continuación, vaya sql sólo el mando # combinaciones de acciones se han establecido:

 
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 

Si el configure_connection no funciona me gustaría probar el método connect así:

 
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 

Creo que el método de conexión se llama antes del método de conexión de configuración, por lo que debería ayudar con el problema del socket.

+1

Wow, gracias. Lo intenté, pero recibí un error de conexión 'No se puede conectar al servidor MySQL local a través del socket..' cuando apago el servidor de la base de datos y realizo esa solicitud. Cuando el servidor db está activado, ahora obtengo 'skip_logging' donde' SQL' estaba previamente en la salida que di más arriba. Seguiré jugando con eso, a menos que pienses que estoy haciendo algo mal. ¡gracias de nuevo! – sa125

+1

Oye, dale una oportunidad al método connect. Agregué el código para eso también. Asegúrese de que esté en sus config/initializers o autoload_once_path, ya que no querrá seguir cargando este código en desarrollo. –

+1

Desearía poder votar su respuesta por segunda vez. Estoy bastante seguro de que esto podría ser un buen complemento. – Jean

Cuestiones relacionadas