2012-06-06 5 views
16

raylar 3.2 bir veritabanı sorguyu tetikler hangi satırını bilmek için bir yol (bir mücevher, bir eklenti veya başka bir şey) var mı? benim günlüğüne Örneğin ben vardır:Bir sorguyu tetikleyen kod satırı nasıl alınır?

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

Sorguyu nasıl tetikler kod satırını bilebilirim? Thx ...

cevap

21

buldum bu çözümü:

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 

bazı başlatıcısı olarak active-record-query-trace mücevher kullanma QueryTrace.enable!

+0

bu ray versiyonuna özgüdür? konsolu kullanarak ruby ​​1.9.3, rails3.2.4 ile çalışan bulamıyorum. Sorgulama yapıldığını ancak kod satırı numarasını göremedim. –

+0

Raylar 3.2.4 ve ruby ​​1.9.3 benim için ... QueryTrace.enable eklemeniz gerekir! bazı başlatıcıda ... – Pioz

+1

Teşekkür ederim, bayım. Bu, bazı n + 1 sorunlarının izlenmesinde bana çok yardımcı oldu. – antinome

-1

İstediğiniz şeyi yapmak için BufferedLogger'a yama uygulayabilirsiniz. senin config/initializers yolu bu dosyayı koyun:

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

... beni oluştururlar işe değil her zaman aynı satırı ekleyin: 'Sizin kodu xxx/lib/query_trace.rb içinde: 20: içinde' log_info_with_trace' tetikledi: '. Çözüme bak. – Pioz

+0

Diğer "QueryTrace" cevabı ile birleştirdiniz. 'Xxx/lib/query_trace.rb'' EXCLUDE_CALLERS' sabiti ekleyebilir ya da devre dışı bırakabilirsiniz. –

1

ekleyin: Gemfile yılında

:

sonra Sonra

:

ActiveRecordQueryTrace.enabled = true