2012-06-06 7 views
16

रेलवे 3.2 में एक तरीका है (एक मणि, एक प्लगइन या कुछ और) क्या पता है कि कोड की कौन सी रेखा डेटाबेस क्वेरी को ट्रिगर करती है? मेरी लॉग में उदाहरण के लिए मेरे पास है:कोड की रेखा कैसे प्राप्त करें जो क्वेरी को ट्रिगर करता है?

User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 5 LIMIT 1 

मैं कोड है कि क्वेरी से चलाता है की लाइन कैसे पता कर सकते हैं? Thx ...

उत्तर

21

मैंने पाया: अपने config/initializers रास्ते में इस फ़ाइल रखो

module QueryTrace 
    def self.enable! 
    ::ActiveRecord::LogSubscriber.send(:include, self) 
    end 

    def self.append_features(klass) 
    super 
    klass.class_eval do 
     unless method_defined?(:log_info_without_trace) 
     alias_method :log_info_without_trace, :sql 
     alias_method :sql, :log_info_with_trace 
     end 
    end 
    end 

    def log_info_with_trace(event) 
    log_info_without_trace(event) 
    trace_log = Rails.backtrace_cleaner.clean(caller).first 
    if trace_log && event.payload[:name] != 'SCHEMA' 
     logger.debug(" \\_ \e[33mCalled from:\e[0m " + trace_log) 
    end 
    end 
end 

कुछ प्रारंभकर्ता में जोड़ने QueryTrace.enable!

+0

यह रेल संस्करण विशिष्ट है? यह कंसोल का उपयोग कर रूबी 1.9.3, रेल 3.2.4 के साथ काम नहीं कर सकता है। मैं क्वेरी निकाल दिया जा सकता था लेकिन कोड लाइन नंबर नहीं। –

+0

रेल के साथ 3.2.4 और रूबी 1.9.3 मेरे लिए काम ... आपको QueryTrace.enable जोड़ने की जरूरत है! कुछ प्रारंभकर्ता में ... – Pioz

+1

धन्यवाद, दयालु महोदय। कुछ एन + 1 समस्याओं को ट्रैक करने में यह मेरे लिए जबरदस्त मदद मिली है। – antinome

-1

आप बंदर कर सकते हैं BufferedLogger जो आप चाहते हैं उसे करने के लिए। इस समाधान

require 'active_support/buffered_logger' 

class ActiveSupport::BufferedLogger 

    def add(severity, message = nil, progname = nil, &block) 
    add_debugging_details(severity) 
    @log.add(severity, message, progname, &block) 
    end 

    private 

    EXCLUDE_CALLERS = Gem.paths.path.clone << 'script/rails' << RbConfig::CONFIG['rubylibdir'] << __FILE__ 

    def add_debugging_details(severity) 
    caller_in_app = caller.select do |line| 
     EXCLUDE_CALLERS.detect { |gem_path| line.starts_with?(gem_path) }.nil? 
    end 

    return if caller_in_app.empty? 

    @log.add(severity, "Your code in \e[1;33m#{caller_in_app.first}\e[0;0m triggered:") 
    end 

end if Rails.env.development? 
+0

मुझे विधि काम नहीं ... यह हमेशा एक ही पंक्ति जोड़ें: 20:: xxx/lib/query_trace.rb में आपका कोड '' में log_info_with_trace 'शुरू हो रहा: '। मेरा समाधान देखें। – Pioz

+0

आपने इसे अन्य 'QueryTrace' उत्तर के साथ संयुक्त किया। आप या तो 'EXCLUDE_CALLERS' निरंतर' xxx/lib/query_trace.rb' जोड़ सकते हैं या इसे अक्षम कर सकते हैं। –

1

active-record-query-trace मणि का उपयोग करना:

Gemfile में:

gem 'active_record_query_trace' 

फिर bundle, तो config/environments/development.rb में:

ActiveRecordQueryTrace.enabled = true