10

Bazı performans sorunlarının izini sürmek için Rails (2.3.8) çerçevesiyle oluşturulan bir sayfa oluşturmaya çalışıyorum ancak veritabanına hiçbir çağrı yapmıyorum.Raylar - veritabanına hiç girmeyen bir istek nasıl yapabilirim?

Basit bir statik sayfa (404.html gibi) oluşturmanın aksine isteğin normal katman yazılımını (routes.rb> controller> view) geçmesini istiyorum ve db sunucusu döndüğünde çalışmalı kapalı (web sunucusu hala çalışıyor). Gerçekleştirilen sayfa, erb'yi kullanarak para birimini gösteren basit bir html sayfasıdır. Şu anda veritabanına kapattığınızda hata alıyorum ve hala yapılmaktadır 2 sorgularını görebilirsiniz:

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

Bir fikrin nasıl tamamen db geçersiz kılmak için bu isteği yaparken? Teşekkürler.

cevap

13

Bunun üstesinden gelmenin tek yolu ActiveRecord'da configure_connection işlevini geçersiz kılmaktır. Bunu yapmak için skip_sql adında bir ApplicationController işlevi oluşturmanızı öneririm?

 
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} 

Sonra sadece denetleyici # üzerinde sql atlamak: Sonra sınıflar ve modellere uygun bu işlevi yapmak

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

: Bazı denetleyici # eylem kombinasyonları için configure_connection fonksiyonunu atlamak istiyorsanız olmadığını test etmek için eylem kombinasyonları ayarladığınız:

 
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 biri böyle bir yöntem bağlayın.Bir çalışacaktı işe yaramazsa:

 
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 

Bağlantı yöntemi yapılandırma bağlantı yönteminden önce çağrıldığına inanıyorum, bu nedenle soket sorununa yardımcı olmalıdır.

+1

Vay, teşekkürler. Bunu denedim, ancak veritabanı sunucusunu kapatıp bu isteği yaptıktan sonra lokal MySQL sunucusuna soket üzerinden bağlanamıyorum bir bağlantı hatası alıyorum. Db sunucusu açık olduğunda, şimdi 'skip_logging'' '' '' '' '' '' '' '' 'yukarıda verilen çıktı çıktı. Yanlış bir şey yaptığımı düşünmediğin sürece onunla oynamaya devam edeceğim. Tekrar teşekkürler! – sa125

+1

Hey, bağlantı yöntemini de bir şans verin. Bunun için de kodu ekledim. Bu kodu geliştirmeye yeniden yüklemeyi istemediğinizden, bunun yapılandırma/başlatıcılarınızda veya bir autoload_once_path olduğundan emin olun. –

+1

Keşke ikinci kez cevap verebilseydim. Eminim ki bu hoş bir eklenti yapabilir. – Jean